我有两个sql查询,一个用于检索给定主题ID的所有事件记录,另一个用于检索除给定主题ID之外的所有事件记录,但没有。
第一个查询检索正确的记录
SELECT `events`.*
FROM `events` INNER JOIN events_topics ON events.id = events_topics.event_id
WHERE (events_topics.topic_id = 75)
应该排除事件的第二个查询不排除任何。
SELECT `events`.*
FROM `events` INNER JOIN events_topics ON events.id = events_topics.event_id
WHERE (events_topics.topic_id <> 75)
答案 0 :(得分:4)
这意味着,对于给定的事件,您在topic_id
中有其他events_topic
值。 A.k.a.,如果您有topic_id = 75
和topic_id = 33
,例如eventid = 45,
,则会返回此eventid,因为查询在topic_id = 33
上匹配
你问过:
“向我提供topic_id&lt;&gt; 75不存在的所有事件”
将查询更改为EXISTS / NOT EXISTS,这是正确的。这是:
“给我所有不存在topic_id = 75的事件”
SELECT `events`.*
FROM `events`
WHERE
EXISTS (SELECT * FROM events_topics.event_id
WHERE events_topics.topic_id = 75
AND
events.id = events_topics.event_id
)
SELECT `events`.*
FROM `events`
WHERE
NOT EXISTS (SELECT * FROM events_topics.event_id
WHERE events_topics.topic_id = 75
AND
events.id = events_topics.event_id
)
答案 1 :(得分:3)
也许是这样的:
select * from Events
where id not in (select event_id from events_topics where topic_id=75)
答案 2 :(得分:2)
您的尝试显示所有事件(主题未显示),只删除主题ID = 75的事件 - 主题组合。所有其他主题(ID <&lt;&gt; 75)仍然存在,因此任何主题为7或63或其他任何事件的事件仍会显示。
您只是设法不显示其唯一主题为id 75的事件。
但我认为您希望没有任何主题的事件具有id = 75:
SELECT events.*
FROM events
LEFT JOIN events_topics
ON events.id = events_topics.event_id
AND events_topics.topic_id = 75
WHERE events_topics.event_id IS NULL
我认为上述内容与您拥有的NOT EXISTS
和NOT IN
版本相同。他们的区别只在于绩效。
答案 3 :(得分:0)
尝试使用'75'
代替75
:
SELECT `events`.*
FROM `events`
INNER JOIN events_topics ON events.id = events_topics.event_id
WHERE (events_topics.topic_id <> '75')
答案 4 :(得分:0)
你的查询没有任何冲突,但请确保数据..以及为什么你在这个`events ??
之外的事件中有单引号检查这些
select events.id from events where events.id <> 75
和
select events_topics.event_id from events_topics where events_topics.event_id <> 75
如果这些提供了正确的数据,请尝试这种方式
SELECT events.*
FROM events
INNER JOIN events_topics ON events.id = events_topics.event_id and
events_topics.topic_id <> 75