2014-02-10 42 views
1

我的印象是,在MySQL中,GROUP BY支持使用列名或列别名'。GROUP BY列名与列别名

我有一些相当简单的SQL,它正在做两个表之间的交叉连接,然后左连接来获得一些匹配的数据(如果存在的话),并连接匹配的数据。这给了奇怪的结果。最后意识到问题似乎是我使用别名而不是实际的列名。

使用别名时,它似乎已经处理了这些行,并且左侧的不匹配行的连接方式不同。因此,尽管共享相同的GROUP BY字段,但获得组返回的2行。

2.查询是由列别名先分组: -

SELECT a.id AS item_id, a.code AS item_code, GROUP_CONCAT(CONCAT_WS(":", c.name, IFNULL(d.value, "void")) 
ORDER BY c.name) AS AllAnaly 
FROM item a 
CROSS JOIN item_analy c 
LEFT OUTER JOIN item_analy_value d ON a.id = d.item_id 
AND c.id = d.analy_id 
GROUP BY item_id, item_code; 

和分组由列名

SELECT a.id AS item_id, a.code AS item_code, GROUP_CONCAT(CONCAT_WS(":", c.name, IFNULL(d.value, "void")) 
ORDER BY c.name) AS AllAnaly 
FROM item a 
CROSS JOIN item_analy c 
LEFT OUTER JOIN item_analy_value d ON a.id = d.item_id 
AND c.id = d.analy_id 
GROUP BY a.id, a.code; 

我敲了一个SQL小提琴,演示了这一点: -

http://sqlfiddle.com/#!2/35a69

我很想念MyS如何QL在GROUP BY子句中处理别名?

+0

Group by不工作任何列的别名! 细节答:http://stackoverflow.com/questions/3841295/sql-using-alias-in-group-by – Jain

+0

@Jain - MySQL是一种风味,这应该工作 - https://dev.mysql.com/ doc/refman/5.0/en/problems-with-alias.html – Kickstart

回答

2

我猜想MySQL正在默认使用与指定的GROUP BY列匹配的非别名列名,如果找不到名称,它将使用别名。在你的例子中, 列名称的查询是正确的,而当你使用别名时,它不会使用别名。

while this query will also like like you grou by column names。

SELECT a.id AS item_id, a.code AS item_code, GROUP_CONCAT(CONCAT_WS(":", c.name, IFNULL(d.value, "void")) 
ORDER BY c.name) AS AllAnaly 
FROM item a 
CROSS JOIN item_analy c 
LEFT OUTER JOIN item_analy_value d ON a.id = d.item_id 
AND c.id = d.analy_id 
+0

认为你说得对。通过我的查询,我给了一个别名,这个名字恰好与我用于连接的一列相同,但是我在实际的SELECT中忽略了它。似乎MySQL已经选择了GROUP BY一个没有被返回的列,而不是被返回的那个名字的别名列。 – Kickstart