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