0

人のテーブルがあるとしましょう...

person:
-----------
id | person
---+-------
 1 | Jim
 2 | Bob
 3 | Frank

...そして、アイテムのテーブルがあります...

item:
----------------
id | item | type
---+------+-----
 1 |   21 |    2
 2 |   10 |    5
 3 |   11 |    1
 4 |    9 |    1

...そして、誰が何を持っているかを説明する表もあります...

person_item:
-------------
item | person
-----+-------
   1 |      2
   2 |      1
   3 |      1

個人が特定の種類のアイテムを複数持っている場合に通知する単一のクエリを作成するにはどうすればよいですか? タイプ (1, 2, 3) のアイテムのみに関係するクエリが必要です。

クエリの結果は、次の形式である必要があります。

---------------
person  |  item
        |  item
--------+------
person  |  item
        |  item
        |  item
--------+------
... etc.

これは私が試したことです...しかし、ゴミが生成されます...

SELECT person.id, item.id FROM person_item AS pi
JOIN item AS i ON i.id = pi.item
JOIN person AS p ON p.id = pi.item
WHERE item.type IN (1,2,3)
HAVING COUNT(pi.person) > 1;
4

2 に答える 2

1

having句はあるが句がないため、クエリは疑わしいですgroup by。また、非常に合理的なエイリアスがある場合は、テーブル名を使用しています。また、人だけでなく、人/タイプの組み合わせ内の個別のアイテムをカウントする必要があります。

これらを考慮して、次のクエリを試してください。

SELECT p.id, i.type, group_concat(i.item) as items
FROM person_item pi join
     item i
     ON i.id = pi.item join
     person p
     ON p.id = pi.person
WHERE i.type IN (1,2,3)
group by p.id, i.type
HAVING COUNT(distinct i.id) > 1;

これは、返される 3 番目のものとしてアイテムのリストも提供します。

于 2013-06-07T21:31:44.800 に答える
1

個人とアイテムの ID だけを見たい場合は、参加する必要はありませんperson- person_item にアクセスするだけです (item_type のアイテムへのリンクを使用)。ただし、各組み合わせを別々の行に表示する場合は、次のように person_item に 2 回アクセスする必要があります。

select pi.person, pi.item
from person_item pi
join (select p.person
      from person_item p
      join item i on p.item = i.item_id and i.type in (1,2,3)
      group by p.person
      having count(*) > 1) c
  on pi.person = c.person
于 2013-06-07T21:38:27.533 に答える