У меня есть таблицы со статьями и пользователями, у обоих есть много-много картирование на третьей таблице - читается.Дополнительные условия в JOIN
Что я пытаюсь сделать здесь, это получить все непрочитанные статьи для конкретного пользователя (user_id
нет в таблице reads
). В моем запросе есть все статьи, но те, которые читаются, отмечены, что если я могу отфильтровать их (поле user_id содержит идентификатор соответствующего пользователя).
У меня есть SQL запрос следующим образом:
SELECT articles.id, reads.user_id
FROM articles
LEFT JOIN
reads
ON articles.id = reads.article_id AND reads.user_id = 9
ORDER BY articles.last_update DESC LIMIT 5;
что дает следующее:
articles.id | reads.user_id
-------------------+-----------------
57125839 | 9
57065456 |
56945065 |
56945066 |
56763090 |
(5 rows)
Это нормально. Это то, чего я хочу.
Я хотел бы получить тот же результат в Catalyst, используя мою модель статьи, но я не могу найти никакой возможности добавить условия в предложение JOIN.
Вы знаете, как добавить AND X = Y
в DBIx JOIN?
Я знаю, что это можно сделать с помощью специального источника и виртуального представления, но у меня есть другие вопросы, которые могут извлечь выгоду из него, и я бы хотел избежать создания виртуального представления для каждого из них.
Спасибо, Canto
Вы пытались добавить его как «стандарт», где п? –
Да. «Стандартное» предложение where будет фильтровать только те статьи, которые читаются пользователем (существует в таблице чтения). В нем не будут отображаться статьи, в которых соответствующая запись в таблице будет NULL. Использование AND с LEFT JOIN предоставит мне ВСЕ статьи. Поле User_id будет установлено, если статья прочитана, если не будет NULL. – canto
Вы не можете использовать условие 'AND reads.user_id = 9' в запросе, если хотите получить статьи с' reads.user_id = NULL'. – krokodilko