GROUP BY列名称与列别名

时间:2014-02-10 17:27:27

标签: mysql

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

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

使用别名,它似乎已经处理了那些行与左边不匹配行的行以不同方式处理。因此,尽管共享相同的GROUP BY字段,但仍然获得该组返回的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

我遗漏了MySQL如何处理别名'在GROUP BY条款?

1 个答案:

答案 0 :(得分:2)

我想发生的事情是MySQL默认使用与指定的GROUP BY列匹配的非别名列名,如果找不到,则使用别名。 在您的示例中,具有列名称的查询是正确的,而当您使用别名时,它将没有别名。

虽然这个查询也会像列名一样起作用。

  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