Проблема при извлечении всех первых записей таблицы при объединении 3 таблиц - PullRequest
0 голосов
/ 04 ноября 2018

Таблицы Сервис, План, Подписка. Требуется получить все записи в таблице Service, но записи должны быть упорядочены на основе наибольшего количества подписок. Я могу получить записи на основе условия соединения, но не могу получить записи в таблице служб, которая не имеет подписки.

Обратите внимание. Каждая служебная запись имеет план. Но может быть Сервис, у которого нет Подписки.

**Service**
service_id
service_name
status
is_active

**Plan**
plan_id
service_id
plan_name
plan_cost

**Subscribe**
subscribe_id
plan_id
person_name

SELECT DISTINCT s.service_id FROM service s JOIN plan p on s.service_id=p.service_id join
subscribe su on p.plan_id=su.plan_id WHERE
(s.status='Published' AND s.is_active=1) GROUP BY su.plan_id 
ORDER BY COUNT(su.subscribe_id) DESC

Может кто-нибудь разобраться в этой проблеме и помочь.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Ну, самый простой ответ: вы хотите левое соединение, чтобы вы могли получить все записи в службе + любые записи в подписке, которые совпадают.

SELECT DISTINCT s.service_id 
FROM service s 
JOIN plan p on s.service_id=p.service_id 
left join subscribe su on p.plan_id=su.plan_id 
WHERE
(s.status='Published' AND s.is_active=1) 
GROUP BY su.plan_id 
ORDER BY COUNT(isnull(su.subscribe_id,0)) DESC

также, вы, вероятно, хотите переместить счет в секцию выбора. как это:

select * from 
SELECT  s.service_id, COUNT(isnull(su.subscribe_id,0)) as [cnt]
FROM service s 
JOIN plan p on s.service_id=p.service_id 
left join subscribe su on p.plan_id=su.plan_id 
WHERE
(s.status='Published' AND s.is_active=1) 
GROUP BY su.plan_id ) A
ORDER BY  [cnt] DESC

Я использовал соглашение SQL-сервера для псевдонимов столбцов. Если вы используете другую СУБД, просто измените ее соответствующим образом. Если у вас есть случаи, когда у сервиса нет плана, вы должны также изменить его на левый.

0 голосов
/ 04 ноября 2018

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

SELECT s.*
FROM service s
LEFT JOIN plan p
    ON s.service_id = p.service_id
LEFT JOIN subscribe su
    ON p.plan_id = su.plan_id
GROUP BY
    s.service_id
ORDER BY
    COUNT(su.subscribe_id) DESC;

Если вы также хотите выбрать количество подписок, вы можете добавить термин COUNT(su.subscribe_id) в предложение select. Обратите внимание, что агрегирование только по service_id при выборе всех столбцов из таблицы service должно быть допустимым, если предположить, что service_id является первичным ключом в этой таблице.

...