MySQL Присоединяющиеся Проблемы - PullRequest
1 голос
/ 21 ноября 2008

Следующий запрос возвращает странные результаты для меня:

SELECT
    `Statistics`.`StatisticID`,
    COUNT(`Votes`.`StatisticID`) AS `Score`,
    COUNT(`Views`.`StatisticID`) AS `Views`,
    COUNT(`Comments`.`StatisticID`) AS `Comments`
FROM `Statistics`
LEFT JOIN `Votes` ON `Votes`.`StatisticID` = `Statistics`.`StatisticID`
LEFT JOIN `Views` ON `Views`.`StatisticID` = `Statistics`.`StatisticID`
LEFT JOIN `Comments` ON `Comments`.`StatisticID` = `Statistics`.`StatisticID`
GROUP BY `Statistics`.`StatisticID`
LIMIT 0, 10

Я запрашиваю это для структуры таблицы следующим образом:

(только данные, относящиеся к Statistics.StatisticID = 8)

Голоса

StatisticID
    8

1012 * Просмотры * StatisticID 8 8 Комментарии

StatisticID
    8
    8
    8
    8
    8

Теперь, если я выполню этот запрос, я получу следующий набор результатов:

StatisticID    Score    Views   Comments
     8           5        5        5

Я знаю, откуда взялась цифра 5 - количество комментариев - и это сработает, если я уберу заявление с комментариями. Может кто-нибудь отладить это, поскольку это вне моей досягаемости (я относительно новичок в SQL).

Спасибо, Росс

Ответы [ 2 ]

4 голосов
/ 21 ноября 2008

При таком объединении вы будете дублировать данные столько раз, сколько найдете строк в других таблицах. Это хорошо, если у вас есть только 1 соответствующая строка в каждой таблице.

Запустите этот запрос без группировки, и вы получите представление о том, почему вы получаете одинаковый результат по всем показателям. Я бы, однако, предположил, что вы получите 10 в качестве количества для каждого поля (1 * 2 * 5) Если вы хотите решить эту проблему, вам нужно вызвать подвыбор для каждого счета.

SELECT
    s.`StatisticID`,
    (SELECT COUNT(*) FROM Votes WHERE Votes.StatisticID = s.StatisticID) AS Score,
    (SELECT COUNT(*) FROM Views WHERE Views.StatisticID = s.StatisticID) AS Views,
    (SELECT COUNT(*) FROM Comments WHERE Comments.StatisticID = s.StatisticID) AS Comments,
FROM `Statistics` s
LIMIT 0, 10

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

2 голосов
/ 21 ноября 2008

Предполагается, что у вас есть поле идентификатора или подобное в голосах / просмотров / комментариев:

SELECT
    `Statistics`.`StatisticID`,
    COUNT(DISTINCT `Votes`.`VoteID`) AS `Score`,
    COUNT(DISTINCT `Views`.`ViewID`) AS `Views`,
    COUNT(DISTINCT `Comments`.`CommentID`) AS `Comments`
FROM `Statistics`
LEFT JOIN `Votes` ON `Votes`.`StatisticID` = `Statistics`.`StatisticID`
LEFT JOIN `Views` ON `Views`.`StatisticID` = `Statistics`.`StatisticID`
LEFT JOIN `Comments` ON `Comments`.`StatisticID` = `Statistics`.`StatisticID`
GROUP BY `Statistics`.`StatisticID`
LIMIT 0, 10

Не проверял, но думаю, что это должно работать. (Мы должны использовать другое поле, потому что statID всегда будет одинаковым в данной группе ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...