2012-03-23 13 views
5

Nie sądzę, żebym mógł użyć klauzuli ORDER BY wewnątrz funkcji GROUP_CONCAT.Korzystanie z klauzuli ORDER BY wewnątrz funkcji GROUP_CONCAT w SQLite

Czy ktoś wie trudny sposób, aby osiągnąć to zachowanie w SQLite?

Widziałem to wcześniej, question. Ale mam złożone zapytanie.

Moje oświadczenie wygląda następująco:

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 i Group2 pochodzi z tej samej tabeli, ale różnych kolumnach: Chcę zachować Zakon Group1 z Group2:

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

tak jeśli pojawi się Group1 w ten sposób: 2,1,3Group2 powinien wyglądać tak: B,A,C

+1

Piszesz w swojej odpowiedzi, że zapytanie robi to, co trzeba. Jakie jest więc pytanie? – newtover

+0

@newto składnia, której używał, jest obsługiwana przez mysql nie sqlite. – chacham15

Odpowiedz

-3

Próbowałem to i uczynić pracę

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

Czy składnia 'GROUP_CONCAT (kolumna ORDER BY some_column)' jest naprawdę obsługiwana przez SQLite? Dla mnie nie działa na 'ZAMÓWIENIE' (SQLite 3.4.7) – zapl

+0

to nie jest obsługiwane, ale moje rozwiązanie działa :) – confucius

+3

To nie działa w sqlite. Nie działa na zamówienie, tak jak zapl powiedział powyżej – livinzlife

8

SQLite nie obsługuje ORDER BY wewnątrz GROUP_CONCAT, ale rzeczywiście można udawać:

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

Następnie trzeba podzieliła wpisz kod, aby odzyskać swój sort i wartość.

+0

Czy możesz trochę rozwinąć? Nie rozumiem twojej odpowiedzi. – nowox

+1

@nowox Nie można sortować bezpośrednio wewnątrz GROUP_CONCAT za pomocą SQLite, więc to polecenie połączy list_order z separatorem (tutaj używam ":") i wartością. Następnie podczas analizowania wyników (dla mnie korzystałem z systemu Android) zapisujesz dane na liście i porządkujesz je na podstawie parametru list_order. – Murphy

0

Co powiesz na coś takiego?

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 

nie testowałem, ale jeśli można udostępnić niektóre dane ...

Powiązane problemy