sql проблема с WHERE (значение 'field' <>) - PullRequest
0 голосов
/ 26 июня 2011

У меня есть два запроса sql: один, который извлекает все записи о событиях для данного идентификатора темы, а другой, который должен извлекать все записи о событиях, кроме заданного идентификатора темы, но не делает этого.

Первый запрос возвращает правильные записи

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)

Ответы [ 5 ]

4 голосов
/ 26 июня 2011

Это означает, что у вас есть другие topic_id значения в events_topic для данного события. A.k.a., если у вас есть topic_id = 75 и topic_id = 33 для, скажем, eventid = 45,, будет возвращен этот вечер, потому что запрос соответствует topic_id = 33

Вы спросили:

"дать мне все события, где topic_id <> 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
            )
3 голосов
/ 26 июня 2011

Может быть, что-то вроде этого:

select * from Events
where id not in (select event_id from events_topics where topic_id=75)
2 голосов
/ 26 июня 2011

Ваша попытка показывает все события (темы не показаны) и просто удаляет комбинации событий и тем с идентификатором темы = 75.Все остальные темы (с идентификатором <> 75) все еще там, поэтому любое событие с темой 7 или 63 или что-либо еще будет отображаться.

Вам удалось не показывать события, в которых их единственная тема имеет идентификатор 75.

Но я думаю, что вы хотите, чтобы события ни в одной из их тем не имели идентификатор = 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, которые у вас есть в качестве ответов.Их разница только в производительности.

0 голосов
/ 26 июня 2011

В вашем запросе нет конфликтов, но, пожалуйста, убедитесь, что у вас есть данные.

Проверьте это

 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
0 голосов
/ 26 июня 2011

Попробуйте '75' вместо 75:

SELECT `events`.*  
FROM `events` 
INNER JOIN events_topics ON events.id =        events_topics.event_id  
WHERE (events_topics.topic_id <> '75')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...