Помогите сделать сложный запрос. LEFT JOIN

Texel

Новичок
Помогите сделать сложный запрос. LEFT JOIN

Задача такая.
Существует таблица фраз

phrases
id - идентификатор фразы
block_id - ид блока в который входит фраза
text - тектс фразы

есть таблица истории ответов пользователя
phrases_log
session_id - ид сессии
phrase_id - ид фразы
user_id - ид пользователя
block_id - ид блока фразы

Задача в том, чтобы написать запрос который бы выбирал из таблицы phrases фразы на которые пользователь ещё не отвечал для данного блока по одной фразе, для данной сессии.
Делать запрос нужно на основе предыдущих ответов пользователя из таблицы phrases_log. Для разнобразия выбора пользователь может ответить на одну фразу из блока фраз, всего ему даётся выбор из четырёх блоков.

Надеюсь разъяснил понятно. Вот запрос который я написал:

SELECT DISTINCT p1.block_id, p1.id, p1.text
FROM phrase_log, phrases

LEFT JOIN phrases as p
ON p.block_id = phrase_log.block_id
AND p.id <> phrase_log.answer_id

WHERE
phrase_log.block_id in (1,2,3,4)
AND phrase_log.session_id = 3
AND phrase_log.answering_user_id = 2
AND phrase_log.answer_id = phrases.id
ORDER BY RAND()
LIMIT 0, 4

По идеии он должен выводить фразы которые не будут соответствовать фразам в условии WHERE. Но этого не происходит.
И ещё проблемма, как сделать выборку строго для четырёх блоков по одной фразе, а то по рандому для одного блока вывыдится иногда больше одной фразы.
 

chira

Новичок
не понял про блоки
посмотри такой запрос
Код:
SELECT DISTINCT p.block_id, p.id, p.text
FROM phrases p
LEFT JOIN phrase_log as l
  ON l.block_id in (1,2,3,4)
    AND l.session_id = 3
    AND l.answering_user_id = 2
    AND phrase_log.answer_id = phrases.id
WHERE l.id IS NULL
ORDER BY RAND()
LIMIT 0, 4
 

Texel

Новичок
проблема решилась таким образом


SELECT id, phrases.block_id, text, answer_id
FROM phrases
LEFT JOIN phrase_log ON phrase_log.answer_id=phrases.id
AND session_id = 2
AND answering_user_id=3
WHERE phrases.block_id IN (1,2,3,4)
HAVING answer_id IS NULL ORDER BY RAND()
 
Сверху