mysql count с правильным соединением возвращает некоторые неправильные значения

mysql join

28 просмотра

2 ответа

У меня проблема с количеством в правом соединении, с помощью этого кода я могу подсчитать, сколько посетителей имеют видео

SELECT video_id, COUNT(video_id) AS Views FROM fm_views GROUP BY video_id ORDER BY Views DESC;

Возвращает следующий пример.

video_id    Views
1668306      10
21041317      4
3845          2
13796095      1
16808537      1
11170454      1

Это правильный счет, теперь я поставил пример 2, который является неправильным счетом

SELECT fm_video.*, IFNULL(COUNT(fm_views.video_id), 0) AS Views FROM fm_views RIGHT JOIN fm_video ON fm_video.video_id = fm_views.video_id GROUP BY fm_video.video_id ORDER BY Views DESC, id DESC;

Это проблема, теперь я понимаю (упрощенная версия без нулевых значений)

video_id    Views
1668306      10
21041317      4
3845          >>4<< This is the problem
13796095      1
16808537      1
11170454      1

Теперь я получаю 4 просмотра в видео 3845, когда у меня есть только 2 записи с этим video_id после правого соединения, остальные значения в порядке, но я думаю, что, когда у меня будет больше записей в базе данных, у меня будет больше проблем с этим неправильно ценности

Я не могу найти ничего полезного с этим простым запросом, как формат.

Автор: Javilico Источник Размещён: 08.11.2019 11:17

Ответы (2)


1 плюс

Решение

Мне right joinтрудно следовать. left joinкажется более естественным, потому что он сохраняет все строки в первой таблице. Кроме того, COUNT()не может вернуться NULL. Итак, это запрос:

SELECT vd.*, COUNT(vw.video_id) AS Views
FROM fm_video vd LEFT JOIN
     fm_views vw
     ON vd.video_id = vw.video_id
GROUP BY vd.video_id
ORDER BY Views DESC, id DESC;

Если это возвращает неожиданные результаты, то это говорит о том, что у вас неверные данные или ваши ожидания неверны.

Для первой возможности я бы предложил проверить, что fm_video(video_id)является первичным ключом в таблице (или, по крайней мере, уникальным). Вы также можете запустить этот код, чтобы увидеть, есть ли дубликаты:

select video_id
from fm_video
group by video_id
having count(*) > 1;

Вы также должны проверить, что video_idимеет одинаковый тип в обеих таблицах.

Автор: Gordon Linoff Размещён: 20.08.2016 12:17

0 плюса

На самом деле, если вы select *увидите несколько пустых fm_viewsстрок, они как-то подсчитываются, добавьте WHEREфильтр и перепишите запрос следующим образом:

SELECT fm_video.*, IFNULL(COUNT(fm_views.video_id), 0) AS Views 
FROM fm_views 
RIGHT JOIN 
fm_video ON fm_video.video_id = fm_views.video_id 
WHERE fm_views.video_id is not null
GROUP BY fm_video.video_id ORDER BY Views DESC, id DESC;

вам просто нужно отфильтровать нулевые строки

WHERE fm_views.video_id is not null

Это происходит, если объединенные таблицы имеют разные номера строк, поэтому у вас есть правильное количество на 2 строки

** Пожалуйста, проголосуйте и отметьте как принятый ответ, если вы найдете это полезным **

Автор: Ahmad Musa Размещён: 20.08.2016 12:50
Вопросы из категории :
32x32