powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом, часть 2!!!
5 сообщений из 5, страница 1 из 1
Помогите с запросом, часть 2!!!
    #34087857
webler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться где же я не так делаю.

Пишу сайт по музыке и видео.
Выборка должна выглядеть таким образом:
есть таблица стран производителей.
есть таблица музыкальных дисков
есть таблица видео дисков
диск может быть активен к показу и нет, это тоже нужно учитывать.

Как вывести список стран и сумарно количество сколько в каждой дисков, только отдельно по музыке и видео. Одним запросом. И там где пусто в обоих случаях не выводить страну.

Например

id(country) country count_music count_video
1 Россия 10 12
2 Украина 0 3

Сделал такой вот запрос
SELECT countries.id, countries.longname_ru,
count(music.id) as count_music,
count(video.id) as count_video
FROM countries, music, video
WHERE (music.active = true AND countries.id = music.country)
OR
(video.active = true AND countries.id = video.country)
GROUP BY countries.longname_ru, countries.id

И в итоге у меня получается какая то лажа.
Страны вроде правильно находит. А считает сумарно диски неправильно. Одинаково в обоих колонках получается и числа какие то нереальные. Не такие как в базе.
...
Рейтинг: 0 / 0
Помогите с запросом, часть 2!!!
    #34088210
webler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отзовитесь умные люди :)
...
Рейтинг: 0 / 0
Помогите с запросом, часть 2!!!
    #34088461
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT countries.id, countries.longname_ru,
       count(music.id) as count_music,
       count(video.id) as count_video
  FROM countries
  left join music on (music.country=countries.id and music.active=true)
  left join video on (video.country=countries.id and video.active=true)
 GROUP BY countries.longname_ru, countries.id
или так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT countries.id, countries.longname_ru,
       count(music.id) as count_music,
       count(video.id) as count_video
  FROM countries
  left join music on (music.country=countries.id)
  left join video on (video.country=countries.id)
 where music.active=true
   and video.active=true
 GROUP BY countries.longname_ru, countries.id
...
Рейтинг: 0 / 0
Помогите с запросом, часть 2!!!
    #34088564
webler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выдает все страны которые есть в базе, и вместо подсчетов нули.
То есть даже неправильнее чем у меня. :(
...
Рейтинг: 0 / 0
Помогите с запросом, часть 2!!!
    #34089917
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
weblerВыдает все страны которые есть в базе, и вместо подсчетов нули.
То есть даже неправильнее чем у меня. :(Оно и не удивительно...
В запросе вообще неверная логика заложена. Он никогда не выдаст правильного результата.
Хотя нет, есть один случай, когда ответ ВОЗМОЖНО будет корректным...

А вообще, попробуйте вот так запрос написать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select countries.id,
       countries.longname_ru as country,
       coalesce(v_video.cnt_active_video, 0 ) as cnt_active_video,
       coalesce(v_video.cnt_noactive_video, 0 ) as cnt_noactive_video,
       coalesce(v_audio.cnt_active_audio, 0 ) as cnt_active_audio,
       coalesce(v_audio.cnt_noactive_audio, 0 ) as cnt_noactive_audio
  from countries
  left outer join
       (
          select country,
                 sum(case when active = true then  1  else  0  end) as cnt_active_video,
                 sum(case when active = false then  1  else  0  end) as cnt_noactive_video
            from video
           group by country           
       ) v_video
    on countries.id = v_video.country
  left outer join
       (
          select country,
                 sum(case when active = true then  1  else  0  end) as cnt_active_audio,
                 sum(case when active = false then  1  else  0  end) as cnt_noactive_audio
            from audio
           group by country           
       ) v_audio
    on countries.id = v_audio.country
 where coalesce(v_video.cnt_active_video, 0 ) !=  0 
   and coalesce(v_video.cnt_noactive_video, 0 ) !=  0 
   and coalesce(v_audio.cnt_active_audio, 0 ) !=  0 
   and coalesce(v_audio.cnt_noactive_audio, 0 ) !=  0 
Надеюсь это будет именно то, что Вам нужно...

Можете наложить дополнительные условия на выборку из таблиц AUDIO и VIDEO, ограничив результирующее множество только доступными для показа записями...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом, часть 2!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]