1

一部のデータを MySQL に保存しており、特定の条件に一致する行を除外したいと考えています。

簡単に聞こえますが、結合基準がいくつか含まれているため、そうではありません。

次のテーブルがあります。

items : id, ...
genres: id, name:varchar, item_id

各アイテムには複数のジャンルがあります。

少なくとも 1 つのジャンルが特定のジャンル名 (または一連の名前) と一致する場合、クエリはアイテムを除外する必要があります。

例えば:

Item with id 1 has 3 genres
  - genre name = 'foo'
  - genre name = 'bar'
  - genre name = 'baz'

指定されたジャンル名が 'bar'、['bar'、'baz'、'xyz'] などの場合、項目 1 は結果セットの一部ではない可能性があります。

アイテムのジャンルを結合したままにし、「genres.name NOT IN (?)」を使用して WHERE ステートメントを適用しようとしました。? 与えられたジャンル名のセットです。

これは (もちろん) 1 つのジャンルのアイテムに対してのみ機能します。複数の WHERE 条件でも同じことが実現できます: WHERE name <> 'a' AND name <> 'b' ...

このクエリを適切に実行する方法はありますか?

前もって感謝します!

4

4 に答える 4

1

次のようなことができます ( sqlfiddle を参照)。

select i.name as item, g.name as genre
from items as i
left join genres as g
  on i.id = g.item_id 
where i.id not in
      (select distinct g2.item_id from genres as g2
       where FIND_IN_SET(g2.name,'foo,bar'));

このようにして、複数のジャンル名に対してチェックしたい場合に機能します。

于 2012-06-14T17:42:39.180 に答える
0

相関サブクエリを使用できます。
例:

SELECT id 
FROM   items i
WHERE  NOT EXISTS (SELECT 1 
                   FROM   genres g
                   WHERE  g.`name` = 'bar' 
                   AND    i.id = g.item_id);

相関サブクエリは、外部クエリを参照するという点で他のサブクエリとは異なります。
相関サブクエリは、外部クエリによって投影/選択された行ごとに実行されます。

于 2012-06-14T17:40:03.627 に答える
0
select * from items i where not exists 
(select '' from genres gen where gen.item_id = i.id and gen.name in ('foo','pop') )

より短く、より単純なクエリ。内側のクエリはキーワード リストのジャンル名をチェックし、行が返されない場合は、外側のクエリの現在の行が選択されます。ここで
出力を確認 します。

Kyraのおかげで 、SQL フィドルから彼のスキーマを借りました。

于 2012-06-14T18:07:31.350 に答える
0

うまくいけば、あなたが求めていることを理解していると思います.MySQLとT-SQLはこの点で似ていると思います. これらは、例から使用していると想定したサンプルテーブルです。

Table1
ID  NAME
1   Item 1
2   Item 2
3   Item 3
4   Item 4
5   Item 5
6   Item 6

Table2
ID  NAME    ITEM_ID
1   Genre 1   1
2   Genre 2   1
3   Genre 3   1
4   Genre 1   2
5   Genre 2   2
6   Genre 3   2
7   Genre 1   3
8   Genre 2   3
9   Genre 3   3
10  Genre 1   4

項目が条件の 1 つに一致する場合に項目を除外するSQL は次のとおりです。

SELECT *
FROM table1 a, table2 b
WHERE a.id = b.item_id
AND b.name NOT IN ('Genre 1', 'Genre 2')

サンプル テーブルに対する上記のクエリから返された結果。

ID  NAME    ID_1    NAME_1  ITEM_ID
1   Item 1    3 Genre 3   1
2   Item 2    6 Genre 3   2
3   Item 3    9 Genre 3   3

代わりに、genre_id (table2.id) に対して除外することもできます。ハードコードされた値の代わりにサブクエリを使用する場合は、「NOT IN」を「NOT EXISTS」に切り替え、「AND」の部分を書き直す必要があります。「NOT IN」は null 値を好まないためです。

このクエリは、各「アイテム」に少なくとも 1 つの「ジャンル」があることも前提としています。条件に一致するものを除くすべての「アイテム」が必要な場合は、それで遊ぶことができると確信しています。

于 2012-06-14T18:05:46.877 に答える