ГДЕ предложение IN group_concat - PullRequest
1 голос
/ 28 ноября 2010

У меня следующий запрос:

SELECT name, GROUP_CONCAT(job SEPARATOR ','),
    count(*) FROM users GROUP BY name ORDER BY name ASC

Возможно ли объединить только те поля задания, которые не содержат '', и если да, то как?Я не могу сделать предложение WHERE, потому что мне все еще нужны те, у которых нет 'job'.

Изобразите следующую таблицу:

+-------+----------+
| name  | job      |
+-------+----------+
| Bob   | doctor   |
| Bob   | teacher  |
| Frank | dentist  |
| Tom   |          |
| Tom   |          |
| Tom   |          |
| Tom   |          |
| Tom   | salesman |
+-------+----------+

Текущий запрос приведет кв:

+--------+---------------------------------+----------+
| name   | GROUP_CONCAT(job SEPARATOR ',') | count(*) |
+--------+---------------------------------+----------+
| Bob    | doctor, teacher                 | 2        |
| Frank  | dentist                         | 1        |
| Tom    | ,,,,salesman                    | 5        |
+--------+---------------------------------+----------+

Но я хочу, чтобы это было:

+--------+---------------------------------+----------+
| name   | GROUP_CONCAT(job SEPARATOR ',') | count(*) |
+--------+---------------------------------+----------+
| Bob    | doctor,teacher                  | 2        |
| Frank  | dentist                         | 1        |
| Tom    | salesman                        | 5        |
+--------+---------------------------------+----------+

(Не обращайте внимания на логику этой таблицы. Это просто простой пример, чтобы прояснить ситуацию)

Причина этого в том, что я собираюсь взорвать () GROUP_CONCAT (job SEPARATOR ',') в php, и в фактической таблице будет легко 1000 бесполезных ,, и это сделаетфункция взрыва очень медленно.Спасибо,

lordstyx.

Ответы [ 3 ]

2 голосов
/ 28 ноября 2010

Я нашел решение: вместо того, чтобы выполнять работу '', я просто сделаю поле пустым, а запрос его игнорирует.

1 голос
/ 14 августа 2013

Вы также можете использовать IF():

SELECT name, GROUP_CONCAT( if(job = '', null, job) SEPARATOR ','),
    count(*) FROM users GROUP BY name ORDER BY name ASC
0 голосов
/ 28 ноября 2010
 SELECT name, GROUP_CONCAT(job SEPARATOR ',') FROM USERS
    WHERE job IS NULL OR job NOT LIKE '%,%'
    GROUP BY name ORDER BY name ASC

Однако вам может быть лучше заменить строку запятой на что-то другое, а затем включить все задания:

 SELECT name, GROUP_CONCAT(REPLACE(job, ',', ';')) FROM USERS
    GROUP BY name ORDER BY name ASC
...