2010-05-07 3 views
1

У меня есть две таблицы:
1. tableA - список записей со многими столбцами. Существует столбец временной отметки «created»
2. tableB используется для отслеживания пользователей в моем приложении, которые заблокировали запись в таблицеA для просмотра. Он состоит из четырех столбцов: id, user_id, record_id и другой столбец временной метки.Почему инструкция SELECT ... JOIN не возвращает результаты?

Я пытаюсь выбрать до 10 записей из таблицы A, которые не были заблокированы для просмотра кем-либо в таблицеB (я также фильтрую в предложении WHERE несколькими другими столбцами из tableA, как состояние записи). Вот что я придумал до сих пор:

SELECT tableA.* FROM tableA 
    LEFT OUTER JOIN tableB ON tableA.id = tableB.record_id WHERE 
    tableB.id = NULL AND 
    tableA.status = 'new' AND 
    tableA.project != 'someproject' AND 
    tableA.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-06 23:59:59' 
    ORDER BY tableA.created ASC LIMIT 0, 10; 

Есть в настоящее время несколько тысяч записей в TABLEA и нулевые записи в TableB. Есть, безусловно, записи, попадающие между этими метками времени, и я проверил это с помощью простого

SELECT * FROM tableA WHERE 
created BETWEEN '1999-01-01 00:00:00' AND '2010-05-06 23:59:59' 

Первое утверждение выше возвращает ноль строк, а второй один возвращает более 2000 строк.

ответ

6
tableB.id = NULL 

должен быть

tableB.id IS NULL 

Он никогда не верно, как это (Nor оно ложно. NULL = NULL принимает значение неизвестность так tableB.id <> NULL бы так же не дал никаких результатов).

См http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html и Why does NULL = NULL evaluate to false in SQL server

+0

Отлично. Работал как шарм. Спасибо! – Stephen

0

ли какие-либо из этих записей между метки времени, следовать вашим двум другим руководствам, например быть новым, но не «someproject»?

Кроме того, в любое время, когда вы используете NULL, вам нужно использовать IS или IS NOT, а не = /! =.

Я не помню, если структура MySQL отличается от идеи ограничений, но если tableB.id - ваш первичный ключ, то он не может быть NULL.

И, наконец, если в таблице B нет записей, как это должно искать неучтенные записи? Он всегда будет возвращать ноль, поскольку в таблице B и таблице A нет соответствующих записей, поскольку tableB пуст.

Попробуйте ввести фиктивную запись в TableB, которая соответствует вашим критериям поиска и посмотреть, изменяется ли выход.

0

Уже ответил, но вот несколько общих советов по устранению неполадок: не пытайтесь решить так много проблем сразу. Мой первый подход состоял бы в том, чтобы устранить всю фильтрацию, где условия и попробовать. Если я получу данные, тогда добавьте их половину. Если это работает, попробуйте другую половину. Повторяйте до тех пор, пока проблема не станет смотреть вам в глаза. Устраняя эту проблему, вы бы быстро сузили ее до инструкции tableB.id = NULL и, вероятно, имели бы D'OH! момент и понял это.