2009-03-19 31 views
103

separados se necesita para ejecutar una consulta como:MySQL resultados como una lista separada por comas

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

Pero me gustaría que el sub-select para devolver una lista separada por comas, en lugar de una columna de datos. ¿Es esto posible, y si es así, cómo?

Respuesta

206

Puede usar GROUP_CONCAT para realizar eso, p. algo así como

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

Gran Funcionó para mí Gracias !!!!! – Devjosh

+9

Además, tenga en cuenta que si está utilizando PHPMyAdmin y desea generar una lista delimitada por comas en la página, use 'GROUP_CONCAT (CAST (nombre de pila como CHAR))' o de lo contrario devolverá algo totalmente inútil como ' [BLOB - 20 Bytes] '. – devios1

+2

La intención es buena y MySQL lo permitirá, pero tenga cuidado (generalmente) con su uso de GROUP BY. Los elementos en la lista de selección deben ser agregados válidos en el contexto de la cláusula GROUP BY. En este caso, p.name no es estrictamente válido. Cualquier base de datos que cumpla con el estándar SQL tratará esto como un error. Para este caso, use MAX (p.name) en la lista de selección o agregue p.name a la cláusula GROUP BY. Ya que Paul probablemente signifique que p.id represente una clave primaria o única, agregar p.name a la cláusula GROUP BY no tendrá ningún impacto en el resultado final. –

7

En lugar de utilizar group concat() puede utilizar simplemente concat()

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

editar esto sólo funciona en MySQL; Oracle concat solo acepta dos argumentos. En Oracle, puede usar algo como select col1 || ',' || col2 || ',' || col3 como foobar de table1; en el servidor sql que usaría + en lugar de tuberías.

+1

Exactamente lo que necesitaba, ¡gracias! –

+0

Esto no debería funcionar en el caso GROUP BY, mientras que GROUP_CONCAT() concatenará el contenido de una sola columna –

0

En mi caso tengo que concatenar todo el número de cuenta de una persona cuyo número de móvil es único. Así que he usado la siguiente consulta para lograr eso.

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

Resultado de la consulta es el siguiente:

Accounts 
93348001,97530801,93348001,97530801 
89663501 
62630701 
6227895144840002 
60070021 
60070020 
60070019 
60070018 
60070017 
60070016 
60070015 
Cuestiones relacionadas