mysql left join не верно срабатывает

184
04 сентября 2021, 08:30

при таком запросе,

SELECT a.id,a.title,ua.fullname,ua.avatar,sum(l.like) as rait,count(c.id) as comments FROM `articles` a
left join `likes` l on l.content_id = a.id and l.type = 1
left join `comments` c on c.content_id = a.id and c.type = 1
left join `user_attributes` ua on ua.user_id = a.user_id
GROUP by a.id,ua.fullname,ua.avatar
ORDER by a.height DESC,rait desc, comments desc

выдает такой результат и вместо 0 выдает null

хотя в первой записи нет ни 6 комментов ни 6 лайков

таблица комментарии

таблица лайков

понял, сделал так, но правильно ли? и почему выдает null?

SELECT a.id,a.title,ua.fullname,ua.avatar,
(select SUM(l.like) from likes as l where l.content_id = a.id AND l.type = 1) as rait,
(select count(c.id) from comments as c where c.content_id = a.id AND c.type = 1) as comments  FROM `articles` a
left join `likes` l on l.content_id = a.id and l.type = 1
left join `comments` c on c.content_id = a.id and c.type = 1
left join `user_attributes` ua on ua.user_id = a.user_id
where a.published = 1 and DAYOFMONTH(a.updated_at) = DAYOFMONTH(CURDATE())
GROUP by a.id,ua.fullname,ua.avatar
ORDER by a.height desc,rait desc,comments desc
Answer 1

Подзапросы должны быть в секции FROM, вместо таблиц. В подзапросе - нужные подсчёт и группировка. Например, вместо таблицы likes должен быть подзапрос, который вернёт content_id и для каждого из них SUM(like) для записей с type = 1.

Навскидку получится так:

SELECT  a.id,
        a.title,
        ua.fullname,
        ua.avatar,
        SUM(l.like) rait,
        SUM(c.id) comments 
FROM articles a
LEFT JOIN ( SELECT content_id, SUM(like) like
            FROM likes
            WHERE type=1
            GROUP BY content_id ) l ON l.content_id = a.id
LEFT JOIN ( SELECT content_id, COUNT(id) id
            FROM comments
            WHERE type=1
            GROUP BY content_id ) c ON c.content_id = a.id
LEFT JOIN user_attributes ua ON ua.user_id = a.user_id
GROUP by    a.id,
            ua.fullname,
            ua.avatar
ORDER by    a.height DESC,
            rait DESC, 
            comments DESC
READ ALSO
Как лучше хранить контент в БД: HTML vs MarkDown?

Как лучше хранить контент в БД: HTML vs MarkDown?

Есть очень большая база данных с статьямиОни сейчас в формате html

254
Django и MySQL с помощью docker-compose

Django и MySQL с помощью docker-compose

Дело происходит ubuntaБез докера пара Django и MySQL, а вот мой докер здесь лишний и портит жизнь всем, включая меня

170
Доступ к данным в памяти из нескольких php-скриптов

Доступ к данным в памяти из нескольких php-скриптов

В БД хранятся котировки валютЭти данные часто используются php-скриптами, причем за один запрос пользователя читается более одной записи...

88