说我有一张人的桌子......
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;
答案 0 :(得分: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;
这也提供了作为第三件事物返回的物品清单。
答案 1 :(得分: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