我的印象是,在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条款?
答案 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