2015-02-06 3 views
1
SELECT * FROM messages as t1 
LEFT JOIN 
(
    SELECT topic_id date_seen FROM seen_log_ex WHERE member_id = :uid 
) as t2 
ON t1.topic_id=t2.topic_id AND t2.date_seen < t1.post_date 

Я хочу выбрать строку из сообщений, если таблица t2 не содержит ее topic_id.LEFT JOIN условия выбора

Я хочу, чтобы выбрать строку из сообщений, если таблица t2 содержит свой topic_id и t2.date_seen < t2.post_date

Я НЕ хочу, чтобы выбрать строку из сообщений, если таблица t2 содержит свой topic_id и t2.date_seen >= t2.post_date

Мой запрос дает неправильные результаты. Как я могу это исправить?

+1

Вы можете добавить данные для лучшего понимания? – Jens

+0

Это скрипт форума. Таблица «messages» содержит столбцы, такие как message_id, topic_id, message_content и т. д. И таблица «seen_log_ex» содержит столбцы member_id, topic_id и date_seen (дата последнего посещения пользователем этой темы). Я пытаюсь выбрать все сообщения, тема которых не посещается пользователем или не была посещена до сообщения post_date. – Wellenbrecher

ответ

1

кажется, что вам все еще нужно member_id = :uid внутри подзапроса, но остальная часть логики должна быть в WHERE, а не в ON в LEFT JOIN.

Он также предполагает, что seen_log_ex имеет нуль или одну строку для каждого topic_id. Если оно может иметь более одной строки для topic_id, результаты будут неверными.

SELECT * 
FROM 
    messages as t1 
    LEFT JOIN 
    (
     SELECT topic_id date_seen FROM seen_log_ex WHERE member_id = :uid 
    ) as t2 
    ON t1.topic_id=t2.topic_id 
WHERE 
    t2.date_seen < t1.post_date 
    OR t2.topic_id IS NULL 
+0

Это один работает , Спасибо. – Wellenbrecher

+1

Этот запрос и запрос из принятого ответа возвращают разные результаты. Почему вы говорите, что они оба работают? –

+0

К сожалению. Я немного отредактировал другой запрос перед выполнением. Этот ответ привел меня к решению, но он сам по себе не прав. Виноват. Ваш ответ правильный. Еще раз спасибо. – Wellenbrecher

1

что относительно;

select * from messages m left join seen_log_ex l 
on m.topic_id = l.topic_id 
where 
(l.topic_id is null OR l.date_seen < l.post_date) 
and l.member_id = :uid 
+0

Это сработало. Спасибо. -teşekkürler- – Wellenbrecher

+2

@Wellenbrecher Этот запрос не возвращает строку из 'сообщений', если таблица' seen_log_ex' не содержит свой 'topic_id', потому что' l.member_id =: uid' находится в предложении 'where'. В вопросе было указано, что он хочет вернуть такие строки. –

+0

@VladimirBaranov Ой, извините. Я немного изменил этот запрос перед выполнением. Этот ответ привел меня к решению, но он сам по себе не прав. Виноват. – Wellenbrecher