|
Модераторы: skyboy |
|
Alx |
|
|||
Ajaxy Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Привет! Помогите, пожалуйста составить запрос. Задача такая (кажется, очень простая):
Есть таблица users и таблица posts. В таблице posts есть поле author_id и поле accepted. Необходимо выбрать пользователей и добавить к ним по два счетчика: кол-во опубликованных постов и общее количество постов. Пробовал все варианты INNER/LEFT/RIGHT JOIN, все время не то, что нужно возвращает, вот один из моих вариантов:
Однако, этот код возращает не то, что нужно (вообще непредсказуемый результат). Заранее спасибо! Это сообщение отредактировал(а) Alx - 7.3.2014, 02:47 |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 453 |
При решении конкретных задача СУБД указывать надо! и постить в соотв. раздел, а не в общие вопросы.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 453 |
Так, в качестве примера...
Для MySQL - нормально, для MS SQL - бредятина. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Alx |
|
|||
Ajaxy Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Akina, не думал, что это будет отличаться в зависимости от СУБД. Вообще говоря в данный момент у меня Postgres. Попробую твой код, спасибо!
|
|||
|
||||
Alx |
|
||||
Ajaxy Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Ругается на SUM(posts.accepted = 1):
А что это должно делать? Может "= 1" лишнее? Но вообще говоря я соврал для упрощения, на самом деле мне нужно делать фильтр не по accepted = 1, а по status = 15, так как у меня есть следующие статусы:
|
||||
|
|||||
Alx |
|
||||
Ajaxy Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Мне удалось добиться результата с помощью одного или двух вложенных запросов.
Я правда не знаю, которое из этих решений лучше и в целом, насколько они оптимальны, не будут ли такие запросы слишком "тяжелыми".
Это сообщение отредактировал(а) Alx - 7.3.2014, 01:09 |
||||
|
|||||
Alx |
|
|||
Ajaxy Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Но тут возникает новая проблема: на эти запросы теперь нельзя наложить никакие дополнительные условия. Например, у меня есть необходимость добавить фильтр по времени:
Однако, этот код придется добавлять к каждому подзапросу, что неудобно и не получится сделать, например, при использовании SQL-билдера (или, например, оформить как scope в Rails). |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 453 |
Задача имеет, конечно, общее решение, которое будет работать на любой СУБД. Но оно гарантированно будет неэффективно. Эффективное решение всегда использует особенности конкретного диалекта. Об том и речь. Здесь используется фича MySQL. Сравнение даёт булев результат. MySQL интерпретирует True как единицу, а False как ноль. С постгрессе есть CASE? должен быть, по идее... тогда
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
Чо? Профиль Группа: Завсегдатай Сообщений: 3470 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
tzirechnoy |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
|
|||
|
||||
Zloxa |
|
|||
Чо? Профиль Группа: Завсегдатай Сообщений: 3470 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
эквивалентно
То же самое, но запись покороче здесь коалес лишний, count null не возвращает. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |