我有两个表:
人
+-----+------------+---------------+
| id | name | address |
+-----+------------+---------------+
| 1 | John Smith | 123 North St. |
| 2 | Joe Dirt | 456 South St. |
+-----+------------+---------------+
person_fields
+-----+------------+-----------+-------+
| id | type | person_id | value |
+-----+------------+-----------+-------+
| 1 | isHappy | 1 | 1 |
| 2 | hasFriends | 1 | 1 |
| 3 | hasFriends | 2 | 1 |
我想从 person
中选择所有 isHappy
AND hasFriends
为 TRUE 的人。这是我尝试过的:
SELECT person.*
FROM person
INNER JOIN person_fields
ON person.id = person_fields.person_id
WHERE
(person_fields.type = 'isHappy' AND person_fields.value IS TRUE)
AND
(person_fields.type = 'hasFriends' AND person_fields.value IS TRUE)
不幸的是,这不起作用,因为您不能在 person_fields
中有一条包含 type = 'isHappy'
和 type = 'hasFriends' 的记录
。我不能 OR
这两个条件,因为那样会同时返回 John Smith 和 Joe Dirt,但我只想要 John Smith,因为他是唯一一个快乐并且同时拥有 friend 的人。
有什么建议吗?提前致谢!
标准解决方案如下所示:
SELECT person_id
FROM person_fields
WHERE type IN ('ishappy','hasfriends')
GROUP
BY person_id
HAVING COUNT(1) = 2;
...其中“2”等于 IN() 中参数的数量
请注意,这假设 (person_id,type) 是唯一的
我是一名优秀的程序员,十分优秀!