2012-03-23 11 views
5

No creo que pueda usar la cláusula ORDER BY dentro de la función GROUP_CONCAT.Usando la cláusula ORDER BY dentro de la función GROUP_CONCAT en SQLite

¿Alguien sabe una manera difícil de lograr este comportamiento en SQLite?

Vi esto question antes. Pero tengo una consulta compleja.

Mi declaración es el siguiente:

SELECT 
    c.col1, c.col3, m.col3, m.col4, 
    count(m.col1), count(re.col2) AS cnt, 
    GROUP_CONCAT(p.col1 ORDER BY p.col1) AS "Group1", 
    GROUP_CONCAT(p.col2 ORDER BY p.col1) AS "Group2", 
    GROUP_CONCAT(CASE WHEN con.col3 is null THEN p.col1 ELSE con.col3 END), 
    con.col4, con.col5, p.col3 
FROM t1 re 
    INNER JOIN t2 c ON (re.col1 = c.col1) 
    INNER JOIN t3 p ON (re.col2 = p.col1) 
    LEFT JOIN t4 con ON (con.col1 = p.col2) 
    INNER JOIN t5 m ON (m.col1 = c.col5) 
GROUP BY re.col1 

Group1 y Group2 viene de la misma mesa, pero diferentes columnas: Quiero preservar el orden de la Group1 con Group2:

table t3 
+------+------+ 
| col1 | col2 | 
+------+------+ 
| 1 | A | 
| 2 | B | 
| 3 | C | 
| 4 | D | 
| 5 | E | 
+------+------+ 

por lo si Group1 aparece así 2,1,3Group2 debería aparecer así B,A,C

+1

usted escribe en su respuesta que la consulta hace lo que necesita. ¿Cuál es la pregunta entonces? – newtover

+0

@newtover la sintaxis que utilizó es compatible con mysql no sqlite. – chacham15

Respuesta

-3

He intentado esto y hacer que el

SELECT 
    c.col1, c.col3, m.col3, m.col4, 
    count(m.col1), count(re.col2) AS cnt, 
    GROUP_CONCAT(p.col1 ORDER BY p.col1) AS "Group1", 
    GROUP_CONCAT(p.col2 ORDER BY p.col1) AS "Group2", 
    GROUP_CONCAT(CASE WHEN con.col3 is null THEN p.col1 ELSE con.col3 END), 
    con.col4, con.col5, p.col3 
FROM t1 re 
    INNER JOIN t2 c ON (re.col1 = c.col1) 
    INNER JOIN (
     SELECT col1, col2, col3, col4, col5 FROM t3 ORDER BY col1 
    ) AS   p ON (re.col2 = p.col1) 
    LEFT JOIN t4 con ON (con.col1 = p.col2) 
    INNER JOIN t5 m ON (m.col1 = c.col5) 
GROUP BY re.col1 
+0

¿La sintaxis 'GROUP_CONCAT (columna ORDER BY some_column)' es realmente compatible con SQLite? Para mí falla en 'ORDER' (SQLite 3.4.7) – zapl

+0

no es compatible pero mi solución hace el trabajo :) – confucius

+3

Esto no funciona en sqlite. No funciona en ORDER como dice zapl anteriormente – livinzlife

8

SQLite no soporta ORDER BY dentro de un GROUP_CONCAT, pero en realidad se puede fingir:

GROUP_CONCAT(list_order || ':' || value) 

Luego hay que dividir el da como resultado un código para recuperar tu clasificación y valor.

+0

¿Puedes elaborar un poco? No entiendo tu respuesta. – nowox

+1

@nowox No puede ordenar directamente dentro de un GROUP_CONCAT con SQLite por lo que este comando concatenará el list_order con un separador (aquí uso ":") y el valor. Luego, al analizar los resultados (para mí usaba Android), guardas los datos en una lista y los vuelves a ordenar en función de list_order. – Murphy

0

¿Qué tal algo así?

SELECT 
    col1, col3, col3, col4, 
    count(col1), count(re.col2) AS cnt, 
    GROUP_CONCAT(p.col1) AS "Group1", 
    GROUP_CONCAT(p.col2) AS "Group2", 
    GROUP_CONCAT(CASE WHEN con.col3 is null THEN p.col1 ELSE con.col3 END), 
    con.col4, con.col5, p.col3 
FROM (
    SELECT 
     * 
    FROM t1 re 
     INNER JOIN t2 c ON (re.col1 = c.col1) 
     INNER JOIN t3 p ON (re.col2 = p.col1) 
     LEFT JOIN t4 con ON (con.col1 = p.col2) 
     INNER JOIN t5 m ON (m.col1 = c.col5) 
    ORDER BY 
     p.col1 ASC, 
     p.col2 ASC 
) 
GROUP BY re.col1 

Yo no lo he probado, pero si se puede compartir algunos datos ...

Cuestiones relacionadas