2015-12-28 4 views
-1

Этот запрос:Почему HAVING и GROUP_CONCAT не работают вместе в этом запросе?

SELECT name, 
REPLACE(REPLACE(REPLACE(LOWER(name),' ',''),'-',''),':','') AS formattedName, 
GROUP_CONCAT(service) 
FROM movies 
GROUP BY formattedName 
HAVING COUNT(CASE WHEN name like "%von brom%" THEN 1 END) > 0; 

дает мне следующий результат:

+---------------------------------------------+---------------------------------------+---------------------+ 
|name           |formattedName       |GROUP_CONCAT(service)| 
+---------------------------------------------+---------------------------------------+---------------------+ 
|LasseMajas detektivbyrå: Von Broms hemlighet |lassemajasdetektivbyråvonbromshemlighet|sfanytime   | 
+---------------------------------------------+---------------------------------------+---------------------+ 
|LasseMajas detektivbyrå - Von Broms hemlighet|lassemajasdetektivbyråvonbromshemlighet|boxer    | 
+---------------------------------------------+---------------------------------------+---------------------+ 
|LasseMajas detektivbyrå - Von Broms hemlighet|lassemajasdetektivbyråvonbromshemlighet|viaplay    | 
+---------------------------------------------+---------------------------------------+---------------------+ 

Все значения в столбце «formattedName» выглядят одинаково, так почему бы не строки сгруппированы вместе?

Если я использую WHERE для фильтрации строк, вместо HAVING, это действительно работает. Это дает мне один ряд в результате, с sfanytime,boxer,viaplay в столбце GROUP_CONCAT(service). Но мне нужно иметь фильтр в HAVING, потому что иначе я не получу всю необходимую мне информацию в некоторых случаях.

Он также работает, если я заменяю GROUP_CONCAT(service) только service. Это только терпит неудачу, если я использую GROUP_CONCAT и HAVING

Все это от phpMyAdmin в базе данных по https://www.one.com. Если я попытаюсь сделать то же самое в идентичной локальной базе данных на своем собственном компьютере с помощью Workbench MySQL, все будет работать так, как ожидалось, и строки сгруппированы во всех случаях (HAVING/WHERE с или без GROUP_CONCAT).

В чем причина этого странного поведения? Может ли это быть чем-то связанным со специальным персонажем «å»?

Мой character_set_server установлен в utf8 в локальной базе данных и до latin1 в базе данных one.com.

Вызов SELECT @@version; на базе One.com дает мне:

5.5.45-MariaDB-1~wheezy 

А на локальной базе данных дает мне:

5.7.9-log 
+0

Похоже несовместимости MariaDB и реальной MySQL. – Barmar

+0

Вы уверены, что в поле 'name' нет непечатаемых символов? – Uueerdo

+0

@Uueerdo Как я могу это проверить? – Istlemin

ответ

0

Вы должны использовать WHERE вместо HAVING если вы не используйте функцию GROUP на ваших данных.

Все возвращенные данные в SELECT должны быть либо в операторе GROUP BY, либо иметь применимую к нему функцию GROUP.

После применения этих двух правил запрос становится:

SELECT name, 
REPLACE(REPLACE(REPLACE(LOWER(name),' ',''),'-',''),':','') AS formattedName, 
GROUP_CONCAT(service) 
FROM movies 
WHERE name LIKE "%von brom%" 
GROUP BY formattedName,name; 
+0

Вы определенно ** можете ** группироваться по псевдониму. – Barmar

+0

Его вопрос состоял в том, как собрать все строки с тем же форматированным именем, которое нужно объединить. Как ваш ответ делает это, когда он группируется по имени? – Barmar

+0

@Barmar: «GROUP BY»: возможно, старые версии или другие СУБД этого не допускают (так что это только мои знания, которые нуждались в настройке :)). Производительность: это будет дерьмо, поскольку индекс больше не может использоваться, поэтому не может быть целесообразно «GROUP» на псевдониме после того, как к нему будут применены функции. –

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