MySQL — «Самый социальный пользователь» с наибольшим количеством комментариев в нескольких таблицах

#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() = «Каждая производная таблица должна иметь свой собственный псевдоним». Есть идеи?