2014-02-10 6 views
1

У меня создалось впечатление, что в MySQL GROUP BY поддерживала использование имен столбцов или псевдонимов столбцов.Имя столбца 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

Мне не хватает чего-то с тем, как MyS QL обрабатывает псевдоним 'в предложениях GROUP BY?

+0

Группа не работает над псевдонимом любой колонки !! Подробнее ans: 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, а если он не найден, вместо него вместо него используются псевдонимы. в вашем примере запрос с именами столбцов правилен, когда вы используете псевдонимы, которые он принимает как не псевдонимы.

в то время как этот запрос будет работать так же, как вы grou по именам столбцов.

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

Смежные вопросы