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

如果您只想查看人员和项目 ID,则无需加入person- 只需访问 person_item(带有 item_type 的项目链接)。但是,如果您希望将每个组合放在单独的行上,则必须访问 person_item 两次 - 如下所示:

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 回答
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;

这也提供了作为返回的第三个事物的项目列表。

于 2013-06-07T21:31:44.800 回答