2012-03-23 4 views
5

Non credo di poter utilizzare la clausola ORDER BY all'interno della funzione GROUP_CONCAT.Utilizzo della clausola ORDER BY all'interno della funzione GROUP_CONCAT in SQLite

Qualcuno conosce un modo complicato per eseguire questo comportamento in SQLite?

Ho visto questo question prima. Ma ho una domanda complessa.

La mia dichiarazione è simile al seguente:

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 e Group2 è venuta dalla stessa tabella, ma diverse colonne: voglio preservare l'ordine del Group1 con Group2:

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

così se Group1 appare in questo modo 2,1,3Group2 dovrebbe apparire come questo B,A,C

+1

Scrive nella sua risposta che la query fa quello che ti serve. Qual è la domanda allora? – newtover

+0

@newtover la sintassi che ha usato è supportato da mysql non sqlite. – chacham15

risposta

-3

Ho provato questo e far funzionare il

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 sintassi 'GROUP_CONCAT (colonna ORDER BY some_column)' è realmente supportata da SQLite? Per me fallisce a 'ORDER' (SQLite 3.4.7) – zapl

+0

non è supportato ma la mia soluzione fa il lavoro :) – confucius

+3

Questo non funziona in sqlite. Fallisce all'ordine come zapl ha detto sopra – livinzlife

8

SQLite non supporta ORDER BY all'interno di un GROUP_CONCAT, ma in realtà si può fingere:

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

allora avete bisogno di dividere il generare un codice per recuperare il tuo ordinamento e valore.

+0

Puoi approfondire un po '? Non capisco la tua risposta. – nowox

+1

@nowox Non è possibile ordinare direttamente all'interno di GROUP_CONCAT con SQLite, quindi questo comando concatenerà list_order con un separatore (qui uso ":") e il valore. Quindi, durante l'analisi dei risultati (per me stavo usando Android), si salvano i dati in un elenco e lo si riordina in base a list_order. – Murphy

0

E qualcosa di simile?

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 

non ho ancora testato, ma se è possibile condividere alcuni dati ...

Problemi correlati