2009-03-19 4 views
103

Мне нужно выполнить запрос, например:Результаты MySQL, как разделенный запятыми список

SELECT p.id, p.name, 
     (SELECT name 
      FROM sites s 
     WHERE s.id = p.site_id) AS site_list 
    FROM publications p 

Но я хотел бы суб-выбора, чтобы вернуть список через запятую, а не столбец данных. Возможно ли это, и если да, то как?

ответ

206

Вы можете использовать GROUP_CONCAT для выполнения этого, например. что-то вроде

SELECT p.id, p.name, GROUP_CONCAT(s.name) AS site_list 
FROM sites s 
INNER JOIN publications p ON(s.id = p.site_id) 
GROUP BY p.id, p.name; 
+1

Великий Он работал для меня спасибо !!!!! – Devjosh

+9

Также обратите внимание, что если вы используете PHPMyAdmin и хотите вывести на страницу список с разделителями-запятыми, используйте 'GROUP_CONCAT (CAST (s.name AS CHAR))', иначе он просто вернет нечто совершенно неиспользуемое, как ' [BLOB - 20 байт] '. – devios1

+2

Цель - это хорошо, и MySQL это позволит, но будьте осторожны (как правило) с использованием GROUP BY. Элементы в списке выбора должны быть действительными агрегатами в контексте предложения GROUP BY. В этом случае p.name не является строго верным. Любая база данных, соответствующая стандарту SQL, будет рассматривать это как ошибку. Для этого случая либо используйте MAX (p.name) в списке выбора, либо добавьте p.name в предложение GROUP BY. Поскольку Павел, вероятно, означает, что p.id представляет первичный или уникальный ключ, добавление p.name в предложение GROUP BY не окажет никакого влияния на конечный результат. –

7

Вместо использования group concat() вы можете использовать только concat()

Select concat(Col1, ',', Col2) as Foo_Bar from Table1; 

редактировать это работает только в MYSQL; Oracle concat принимает только два аргумента. В оракуле вы можете использовать что-то вроде select col1 || ',' || col2 || ',' || col3 как foobar из таблицы1; в sql-сервере вы бы использовали + вместо труб.

+1

То, что мне нужно, спасибо! –

+0

Это не должно работать в случае GROUP BY, тогда как GROUP_CONCAT() будет конкатенатировать содержимое одного столбца –

0

В моем случае мне нужно конкатенировать весь номер учетной записи человека, номер мобильного телефона которого уникален. Поэтому для этого я использовал следующий запрос.

SELECT GROUP_CONCAT(AccountsNo) as Accounts FROM `tblaccounts` GROUP BY MobileNumber 

Результат запроса ниже:

Accounts 
93348001,97530801,93348001,97530801 
89663501 
62630701 
6227895144840002 
60070021 
60070020 
60070019 
60070018 
60070017 
60070016 
60070015 
Смежные вопросы