2012-03-23 61 views
12

Tôi có một bảng MySQL với yêu cầuĐiều kiện trong MySQL GROUP_CONCAT

+--------+-------------+-----+ 
| req_id | req_name | ... | 
+--------+-------------+-----+ 
| 1  | testrequest | ... | 
+--------+-------------+-----+ 

và một bảng với phiếu trên yêu cầu đó.

+--------+-----------+----------+ 
| req_id | vote_name | approved | 
+--------+-----------+----------+ 
| 1  | User1  | 1  | 
| 1  | User2  | 1  | 
| 1  | User3  | 1  | 
| 1  | User4  | 0  | 
| 1  | User5  | 0  | 
+--------+-----------+----------+ 

Các loại xem tôi muốn:

+--------+-------------+---------------------+--------------+ 
| req_id | req_name | approved_by   | rejected_by | 
+--------+-------------+---------------------+--------------+ 
| 1  | testrequest | User1, User2, User3 | User4, User5 | 
+--------+-------------+---------------------+--------------+ 

Cho đến nay, tuy nhiên, tôi đã chỉ có thể thực hiện điều này:

+--------+-------------+----------+---------------------+ 
| req_id | req_name | approved | by     | 
+--------+-------------+----------+---------------------+ 
| 1  | testrequest | YES  | User1, User2, User3 | 
| 1  | testrequest | NO  | User4, User5  | 
+--------+-------------+----------+---------------------+ 

Truy vấn tôi đã sử dụng:

SELECT requests.req_id, req_name, CASE 
     WHEN approved THEN 'YES' 
     ELSE 'NO' 
     END AS approved, GROUP_CONCAT(vote_name ORDER BY vote_name ASC SEPARATOR ', ') AS by 
FROM requests 
LEFT JOIN votes ON requests.req_id = votes.req_id 
GROUP BY requests.req_id, approved 
ORDER BY requests.req_id DESC; 

Câu hỏi của tôi là, làm cách nào để có 2 group_c oncats trong cùng hàng với các giá trị khác nhau?

Cảm ơn rất nhiều!

+0

'thứ tự by' đang làm việc với 'group_concat' – safarov

Trả lời

36

Hãy thử điều này:

select r.req_id, r.req_name, 
    group_concat(if(approved, vote_name, null) separator ', ') approvedBy, 
    group_concat(if(approved, null, vote_name) separator ', ') rejectedBy 
from requests r 
left join votes v on r.req_id = v.req_id 

Kết quả:

+--------+-------------+---------------------+--------------+ 
| REQ_ID | REQ_NAME |  APPROVEDBY  | REJECTEDBY | 
+--------+-------------+---------------------+--------------+ 
|  1 | testrequest | User1, User2, User3 | User4, User5 | 
+--------+-------------+---------------------+--------------+ 
+1

Tuyệt vời, cảm ơn! Điều đó thực hiện chính xác những gì tôi muốn. :) – Rapsey

+1

Điều này cực kỳ hữu ích, cảm ơn! –

1

tôi đã cố gắng tái sử dụng truy vấn của bạn bên trong truy vấn khác

SELECT req_id, 
    req_name, 
    GROUP_CONCAT(case approved when 'YES' then voted_by else null end SEPARATOR ', ') AS approved_by, 
    GROUP_CONCAT(case approved when 'NO' then voted_by else null end SEPARATOR ', ') AS rejected_by 
FROM 
(
SELECT requests.req_id, req_name, CASE 
    WHEN approved THEN 'YES' 
    ELSE 'NO' 
    END AS approved, 
    GROUP_CONCAT(vote_name ORDER BY vote_name ASC SEPARATOR ', ') AS voted_by 
FROM requests 
LEFT JOIN votes ON requests.req_id = votes.req_id 
GROUP BY requests.req_id, approved 
ORDER BY requests.req_id DESC 
) t 
group by req_id 
+0

Cảm ơn đã trả lời nhanh chóng! Bạn có nghĩ rằng nó có thể đạt được điều này mà không cần sử dụng một truy vấn phụ? Bởi vì nếu tôi không nhầm, MySQL không cho phép các truy vấn con trong mệnh đề FROM của một khung nhìn .. – Rapsey

+0

Ah ok. Sẽ phải nhìn vào nó. –

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