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

TableB からの を持つ TableA からすべてのids を取得していませんclass_id。また、他のより良いクエリの提案も受け付けています。

これは私が欲しいものです:

  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) ごとに 1 つの行を持つ適切なテーブルを作成する必要があります。

[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, 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 に答える
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,',%')

A での B の出現を探しているためです。

また、コロンを連結するときは、コロンの後のスペースに注意してください

于 2013-01-23T22:38:02.380 に答える