2012-03-23 44 views
12

に私が要求条件は、MySQL GROUP_CONCAT

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

とMySQLのテーブルとそのような要求に票を持つテーブルがあります。

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

私が欲しいビューの種類:

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

私が使用したクエリ:

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

はこれまでのところ、しかし、私はこれを実現することができました

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; 

私の質問は、どうすれば2つのgroup_c同じ行の別の値でのoncats?

ありがとうございます!

+0

'group_concat' – safarov

答えて

36

これを試してみてください別のクエリ内のクエリを再使用してみました:

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 

結果:

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

素晴らしいです、ありがとう!それはまさに私が望んでいたことです。 :) – Rapsey

+1

これは非常に便利です、ありがとう! –

1

は私が

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

'と協力してby'注文早速のお返事ありがとうございます!サブクエリを使わずにこれを達成することは可能だと思いますか?私が間違っていないと、MySQLはビューのFROM節でサブクエリを許可しないためです。 – Rapsey

+0

ああ。それを調べなければならないだろう。 –