#mysql #sql
#mysql #sql
Вопрос:
У меня есть две проблемные таблицы — «videoComments», «storyComments».
Мне нужно найти ‘posterID’, который содержит наибольшее количество записей в videoComments
и storyComments
. Вот код, который у меня есть на данный момент, но он вызывает только videoComments
:
$sql = "SELECT (SELECT posterID
FROM videoComments
GROUP BY posterID
ORDER BY COUNT(posterID) DESC LIMIT 1) ) AS mostSocialUser ";
Как мне извлечь его и сравнить КОЛИЧЕСТВО posterID из обеих таблиц?
Ответ №1:
Используйте:
SELECT x.posterid,
COUNT(y.posterid) COUNT(z.posterid) AS numComments
FROM (SELECT vc.posterid
FROM VIDEOCOMMENTS vc
UNION
SELECT sc.posterid
FROM STORYCOMMENTS sc) x
LEFT JOIN VIDEOCOMMENTS y ON y.posterid = x.posterid
LEFT JOIN STORYCOMMENTS z ON z.posterid = x.posterid
GROUP BY x.posterid
ORDER BY numComments DESC
LIMIT 1
Комментарии:
1. @Joel Hackney:
x
это производная таблица, которая содержит уникальный список всех плакатов, потому что плакат может существовать только в одной из двух таблиц. Этот список пользователей затем используется для ОБЪЕДИНЕНИЯ таблиц по ЛЕВОМУ краю, чтобы подсчитать соответствующие комментарии. ПОРЯДОК и ОГРАНИЧЕНИЕ гарантируют, что возвращается единственный самый высокий постер, но это не значит, что не может быть связей…2. до вчерашнего дня я даже не знал о вложенных операторах, так что для меня все это ново и замечательно… спасибо за объяснение и ответ, это работает замечательно — меня не волнуют связи, но я вижу, что это обычный следующий шаг.
Ответ №2:
Попробуйте это:
SELECT (
SELECT posterID FROM (
SELECT posterID FROM videoComments
UNION
SELECT posterID FROM storyComments
) GROUP BY posterID
ORDER BY COUNT(posterID) DESC LIMIT 1
) AS mostSocialUser
Комментарии:
1. Эй, Эндрю, спасибо, приятель, я играл с UNION, но без любви… в любом случае, ваше предложение возвращает mysql_error() = «Каждая производная таблица должна иметь свой собственный псевдоним». Есть идеи?