2012-03-23 32 views
5

Tôi không nghĩ rằng tôi có thể sử dụng mệnh đề ORDER BY bên trong hàm GROUP_CONCAT.Sử dụng mệnh đề ORDER BY bên trong hàm GROUP_CONCAT trong SQLite

Có ai biết một cách khéo léo để thực hiện hành vi này trong SQLite không?

Tôi đã thấy số này question trước đây. Nhưng tôi có một truy vấn phức tạp.

tuyên bố của tôi trông như thế này:

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 

Group1Group2 đến từ cùng một bảng nhưng các cột khác nhau: Tôi muốn giữ gìn trật tự của Group1 với Group2:

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

nên nếu Group1 xuất hiện như thế này 2,1,3Group2 sẽ xuất hiện như thế này B,A,C

+1

Bạn viết trong câu trả lời của bạn rằng các truy vấn những gì bạn cần. Vậy thì câu hỏi là gì? – newtover

+0

@newtover cú pháp mà anh ta sử dụng được hỗ trợ bởi mysql chứ không phải sqlite. – chacham15

Trả lời

-3

Tôi đã cố gắng này và nó làm cho công việc

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

Cú pháp 'GROUP_CONCAT (cột ORDER BY some_column)' có thực sự được hỗ trợ bởi SQLite không? Đối với tôi nó không thành công tại 'ORDER' (SQLite 3.4.7) – zapl

+0

nó không được hỗ trợ nhưng giải pháp của tôi làm công việc :) – confucius

+3

Điều này không hoạt động trong sqlite. Nó không thành công tại ORDER như zapl đã nói ở trên – livinzlife

8

SQLite không hỗ trợ ORDER BY bên trong một GROUP_CONCAT, nhưng bạn có thể thực sự giả mạo nó:

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

Sau đó, bạn cần phải chia dẫn đến mã để lấy lại loại và giá trị của bạn.

+0

Bạn có thể xây dựng một chút không? Tôi không hiểu câu trả lời của bạn. – nowox

+1

@nowox Bạn không thể sắp xếp trực tiếp bên trong một GROUP_CONCAT với SQLite để lệnh này sẽ nối chuỗi danh sách với một dấu tách (ở đây tôi sử dụng ":") và giá trị. Sau đó, khi phân tích cú pháp các kết quả (đối với tôi tôi đã sử dụng Android), bạn lưu dữ liệu vào một danh sách và sắp xếp lại nó dựa trên list_order. – Murphy

0

Còn thứ gì đó như thế này?

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 

tôi đã không kiểm tra nó nhưng nếu bạn có thể chia sẻ một số dữ liệu ...

Các vấn đề liên quan