| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > [Postgres]2 JOIN одной таблицы с разными условиями |
| Автор: Alx 6.3.2014, 11:32 | ||
| Привет! Помогите, пожалуйста составить запрос. Задача такая (кажется, очень простая): Есть таблица users и таблица posts. В таблице posts есть поле author_id и поле accepted. Необходимо выбрать пользователей и добавить к ним по два счетчика: кол-во опубликованных постов и общее количество постов. Пробовал все варианты INNER/LEFT/RIGHT JOIN, все время не то, что нужно возвращает, вот один из моих вариантов:
Однако, этот код возращает не то, что нужно (вообще непредсказуемый результат). Заранее спасибо! |
| Автор: Akina 6.3.2014, 16:49 |
| При решении конкретных задача СУБД указывать надо! и постить в соотв. раздел, а не в общие вопросы. |
| Автор: Akina 6.3.2014, 17:49 | ||
Так, в качестве примера...
Для MySQL - нормально, для MS SQL - бредятина. |
| Автор: Alx 7.3.2014, 00:20 |
| Akina, не думал, что это будет отличаться в зависимости от СУБД. Вообще говоря в данный момент у меня Postgres. Попробую твой код, спасибо! |
| Автор: Alx 7.3.2014, 00:40 | ||||
Ругается на SUM(posts.accepted = 1):
А что это должно делать? Может "= 1" лишнее? Но вообще говоря я соврал для упрощения, на самом деле мне нужно делать фильтр не по accepted = 1, а по status = 15, так как у меня есть следующие статусы:
|
| Автор: Alx 7.3.2014, 01:09 | ||||
| Мне удалось добиться результата с помощью одного или двух вложенных запросов. Я правда не знаю, которое из этих решений лучше и в целом, насколько они оптимальны, не будут ли такие запросы слишком "тяжелыми".
|
| Автор: Alx 7.3.2014, 02:26 | ||
Но тут возникает новая проблема: на эти запросы теперь нельзя наложить никакие дополнительные условия. Например, у меня есть необходимость добавить фильтр по времени:
Однако, этот код придется добавлять к каждому подзапросу, что неудобно и не получится сделать, например, при использовании SQL-билдера (или, например, оформить как scope в Rails). |
| Автор: Akina 7.3.2014, 07:58 | ||
Задача имеет, конечно, общее решение, которое будет работать на любой СУБД. Но оно гарантированно будет неэффективно. Эффективное решение всегда использует особенности конкретного диалекта. Об том и речь. Здесь используется фича MySQL. Сравнение даёт булев результат. MySQL интерпретирует True как единицу, а False как ноль. С постгрессе есть CASE? должен быть, по идее... тогда
|
| Автор: Zloxa 9.3.2014, 22:26 |
Групбай нужен и users.* нельзя |
| Автор: tzirechnoy 10.3.2014, 10:18 | ||
|
| Автор: Zloxa 10.3.2014, 10:22 | ||
эквивалентно
То же самое, но запись покороче здесь коалес лишний, count null не возвращает. |