Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择是否左连接是和不是(MYSQL)?_Mysql_Select_Join - Fatal编程技术网

选择是否左连接是和不是(MYSQL)?

选择是否左连接是和不是(MYSQL)?,mysql,select,join,Mysql,Select,Join,我有一张桌子“人” 另一个是“hobbiesConnection”,他们是作为一个OneToMany连接的 我想建立一个搜索,在那里可以搜索有爱好和没有爱好的人 比如: SELECT * FROM people LEFT JOIN hobbiesConnection ON hobbiesConnection.people_id = hobbiesConnection.hobby_id WHERE hobby_id = 4 AND hobby_id != 5 现在我得到了嗜好4的人,但我想得到

我有一张桌子“人”

另一个是“hobbiesConnection”,他们是作为一个OneToMany连接的

我想建立一个搜索,在那里可以搜索有爱好和没有爱好的人

比如:

SELECT * FROM people
LEFT JOIN hobbiesConnection ON hobbiesConnection.people_id = 
hobbiesConnection.hobby_id
WHERE hobby_id = 4 AND hobby_id != 5
现在我得到了嗜好4的人,但我想得到一个空的结果,因为这两个条件都必须适合这个人

有人知道如何做到这一点吗?

使用(不)EXISTS子句:

SELECT * FROM people p
WHERE TRUE
AND EXISTS (
  SELECT TRUE FROM hobbiesConnection hc 
  WHERE hc.people_id = p.people_id -- or p.id? you didnt mention
  AND hobby_id = 4
)
AND NOT EXISTS (
  SELECT TRUE FROM hobbiesConnection hc 
  WHERE hc.people_id = p.people_id -- or p.id? you didnt mention
  AND hobby_id = 5
)
使用联接可以实现同样的效果

SELECT p.* 
FROM people p
JOIN hobbiesConnection h4 ON TRUE
    AND h4.people_id = p.people_id -- or p.id? you didnt mention
    AND h4.hobby_id = 4
LEFT JOIN hobbiesConnection h5 ON TRUE
    AND h5.people_id = p.people_id -- or p.id? you didnt mention
    AND h5.hobby_id = 5
WHERE h5.id IS NULL -- or whatever column from that table

看看小提琴:

首先,你的加入不正确。这两个表应使用外键/公共列链接。尝试下面的查询

SELECT * FROM people
LEFT JOIN hobbiesConnection 
ON hobbiesConnection.people_id = people.people_id
And (hobbiesConnection.hobby_id = 4 AND hobbiesConnection.hobby_id != 5)

改变去哪里和。改变或改变。您可能需要括号
,其中
条件仅由
hobby\u id
的值
4
满足。
和hobby\u id!=5
零件冗余;您可以安全地删除它。people\u id=hobby\u id上的连接看起来不正确显示表格结构,显示一些输入数据和预期结果。您编辑了答案-现在是正确的。我仍然认为整个查询是错误的-考虑示例数据在查询中运行:它为PopePyID 1返回一行(它有爱好5,所以它不应该在这里),对于PopePyId=3(它没有爱好4——所以它也不应该在这里)