2016-11-29 2 views
0

は、次の表を検討(サンプルテーブルを、これらは、テーブル内の正確な値ではありません)mysqlで2つのコンマ区切りのリスト(group_concatで取得)の間に包含チェックを実装することは可能ですか?

+-----+--------+--------+ 
| uid | pqid | rqid | 
+-----+--------+--------+ 
| 1 | 1,2,3 | 1,3 | 
| 2 | 1,2 | 2,3 | 
| 3 | 2  | 2,3 | 
| 4 | 2,3 | 3  | 
| 5 | 1,3 | 1,3 | 
+-----+--------+--------+ 

私はpqidに含まれるrqidを持っている、行を選択しようとしています。 「含む」とは、rqidのコンマ区切りIDをすべてカンマ区切りリストpqidに入れることを意味します。 上記の例の行では、uid 1,4および5を選択する必要があります。

これはmysqlで実行可能なものですか?もしそうなら誰かを助けることができますか?

PS:(この が役立つ場合)pqidrqid

  1. この値は、列のIDがソートされるgroup_concat
  2. によってヌルはっきりとしない生成され
+1

複数の値を1つの列に保存しないでください。あなたはテーブルデザインを変更する必要があります。 –

+0

'FIND_IN_SET'と呼ばれるものがありますが、これはCSVリストではなく' rqid'に_single_値がある場合にのみ機能します。それでも、テーブルにCSVデータを保存しないでください。 –

+0

@TimBiegeleisenは 'FIND_IN_SET'を指摘してくれてありがとうございます。 – n00b

答えて

0

得られた結果の上に次のようなチェックを付けてください:

select * from (
//QUERY THAT brings grouped result 
) alias where alias.pqid like '%2,3,4%' or alias.rqid like '%1,2%' 
0

私はあなたのためにそれを行うためにすごく驚異的なビット(rqidのカンマで区切られたリストに1000項目まで対応しています)。これが示す主なことは、データベースを正規化する方がよいということです。

SELECT a.uid, a.pqid, a.rqid 
FROM some_table a 
INNER JOIN 
(
    SELECT DISTINCT uid, pqid, rqid, SUBSTRING_INDEX(SUBSTRING_INDEX(rqid, ',', hundreds.acnt * 100 + tens.acnt * 10 + units.acnt + 1), ',', -1) as a_rqid 
    FROM some_table 
    CROSS JOIN 
    (
     SELECT 1 acnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 
    ) units 
    CROSS JOIN 
    (
     SELECT 1 acnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 
    ) tens 
    CROSS JOIN 
    (
     SELECT 1 acnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 
    ) hundreds 
) sub0 
ON a.uid = sub0.uid 
AND FIND_IN_SET(sub0.a_rqid, a.pqid) 
INNER JOIN 
(
    SELECT DISTINCT uid, pqid, rqid, SUBSTRING_INDEX(SUBSTRING_INDEX(rqid, ',', hundreds.acnt * 100 + tens.acnt * 10 + units.acnt + 1), ',', -1) as a_rqid 
    FROM some_table 
    CROSS JOIN 
    (
     SELECT 1 acnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 
    ) units 
    CROSS JOIN 
    (
     SELECT 1 acnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 
    ) tens 
    CROSS JOIN 
    (
     SELECT 1 acnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 
    ) hundreds 
) sub1 
ON a.uid = sub1.uid 
GROUP BY a.uid, a.pqid, a.rqid 
HAVING COUNT(DISTINCT sub0.a_rqid) = COUNT(DISTINCT sub1.a_rqid) 
関連する問題