9

同じフィールドの 2 つ以上の値を満たす項目を連想テーブルから選択しようとしていますが、わかりにくいと思います。説明させてください。

+-----------------------+
| item_id | category_id |
+-----------------------+
|   1     |    200      |
|   1     |    201      |
|   1     |    202      |
|   2     |    201      |
|   2     |    202      |
|   3     |    202      |
|   3     |    203      |
|   4     |    201      |
|   4     |    207      |
+-----------------------+

テーブルでは、合格したカテゴリにあるアイテムのみを選択できるようにしたいと考えています。たとえば、201 と 202 のカテゴリ ID を渡すと、両方のカテゴリに含まれるアイテムのみが必要になります (他のカテゴリを持つこともできますが、少なくともクエリ対象のカテゴリに含まれている必要があります)。カテゴリ 201 と 202 にあるのはアイテム 1 と 2 だけなので、アイテム 1 と 2 のみが必要です。

私の最初のSQLステートメントは次のようなものでした

SELECT * FROM item_category WHERE category_id = 201 AND category_id = 202;

しかし、明らかにそれはうまくいきません。

SELECT * FROM item_category WHERE category_id = 201 OR category_id = 202;

上記のクエリも、項目 4 と 3 も返すため機能しません。

では、少なくとも両方のカテゴリに含まれる必要があるアイテムのみを選択するにはどうすればよいでしょうか?

2 つ以上のカテゴリ ID を渡す可能性があることに注意してください。

ご協力ありがとうございました。

4

5 に答える 5

11

WHERE 句の式は、結合された結果セットの1 つの行に対して機能します。WHERE category_id = 201 AND category_id = 2021 つの行に 2 つの値を指定できないためです。

したがって、テーブルの 2 つの行を結果セットの 1 つの行に結合する何らかの方法が必要です。自己結合でこれを行うことができます:

SELECT c1.item_id
FROM item_category AS c1
INNER JOIN item_category AS c2 ON c1.item_id = c2.item_id
WHERE c1.category_id = 201 AND c2.category_id = 202

この手法は、 N 個の値を一致させるためにN-1 個の結合が必要になるため、3 つ、4 つ、5 つ、またはそれ以上の値を検索する場合にスケールアップするのは困難です。

したがって、別の方法は GROUP BY を使用することです。

SELECT c.item_id, COUNT(*) AS cat_count
FROM item_category AS c
WHERE c.category_id IN (201,202)
GROUP BY c.item_id
HAVING cat_count = 2

どちらの手法も問題なく、さまざまな状況でうまく機能します。

于 2011-09-13T19:04:22.360 に答える
0

今は正確なクエリを提供する時間がありませんが、次のようなことを試してください。

select item_category.* from 
item_category ,  item_category ic1, item_category ic2 where 
ic1.category_id = 201 and 
ic2.category_id = 202 and 
ic1.item_id = ic2.item_id and 
item_category.item_id = ic1.item_id and 
item_category.item_id = ic2.item_id;

条件が間違っているかもしれませんが、この方法で何かを試すことができます。

于 2011-09-13T19:06:42.130 に答える
0

JOIN または GROUP BY を使用します。

SELECT category_id, fieldhere, anotherfield
FROM item_category
WHERE category_id in (201,202)
GROUP BY category_id
HAVING count(category_id) = 2
于 2011-09-13T19:03:12.223 に答える
0

各 item_id、category_id が一意であると仮定すると、

select *, count(item_id) as c from item_category
where category_id in (201, 202)
group by item_id
having c = 2;

c = 2 を c = (カテゴリ数) に置き換えます。

于 2011-09-13T19:03:37.790 に答える
-2

あなたは試すことができます:

SELECT * FROM item_category WHERE category_id IN (201, 202, ...)

(または、コメントが言うように...あなたはそうではないかもしれません。)

于 2011-09-13T19:01:06.377 に答える