0

我有这个查询:

   SELECT A.id FROM TableB B
   LEFT JOIN TableA A ON 
          CONCAT(',',B.class_id,',') LIKE CONCAT('%,',A.class_id,',%')
   WHERE A.class_id is not null

表A

 [id]   |   [class_id]
---------------------
 One       1, 10, 16, 18
 Two       14, 11
 Three     19, 13, 15
 Four      10 

表B

 [id]   |   [class_id]
---------------------
 ABC         1
 AC          1
 DE          10 
 DEC         19
 ACD         16
 BCD         18
 BCO         18

我没有id从 TableA 中获得所有class_id来自 TableB 的 s。我也愿意接受任何其他更好的查询建议。

这就是我要的:

  One   // class_id contains  1, 10 16 and 18 that are in `TableB` class_id
  Three // class_id contains 19 which is in `TableB` class_id
  Four  // class_id contains 10 which is in `TableB` class_id
4

4 回答 4

2

虽然您可能会使用此策略,但它会很棘手且查询速度非常慢。问题在于出现在 csv 列表开头或结尾的数字,因此与模式 '%,X,%' 不匹配

你应该做的是制作一个每个(id,class_id)一行的正确表,如下所示:

[id]   |   [class_id]
---------------------
One       1
One       10
One       16
One       18
Two       14
Two       11
Three     19
Three     13
Three     15
Four      10

然后你的查询变成一个普通的连接:

SELECT A.id, B.class_id FROM TableB B
join TableA A ON 
      B.class_id = A.class_id
where A.class_id is not null
于 2013-01-23T22:28:31.397 回答
1

这应该工作(编辑):

select A.id from TableA A where A.id not in (
SELECT distinct A2.id FROM TableA A2 where 
    not exists (select B.id from TableB B where CONCAT(',',B.class_id,',') 
                         like CONCAT('%,',A2.class_id,',%')))
于 2013-01-23T22:28:23.227 回答
1

看起来您只是混淆了搜索字符串:

CONCAT(', ',B.class_id,',') LIKE CONCAT('%, ',A.class_id,',%')

应该

CONCAT(', ',A.class_id,',') LIKE CONCAT('%, ',B.class_id,',%')

因为您正在寻找 B 在 A 中的出现。

另外,在连接冒号时注意冒号后面的空格

于 2013-01-23T22:38:02.380 回答
1
SELECT a.id, b.class_id
FROM TableA a, TableB b
WHERE CONCAT(', ',a.class_id,', ') LIKE CONCAT('%, ',b.class_id,', %');

你实际上不需要a.class_id is not null...因为来自 b.class_id 的字符串不会在 a.class_id 中。

SQL小提琴

于 2013-01-23T22:52:03.443 回答