Отдельные популярные хиты - PullRequest
0 голосов
/ 11 июня 2009

Может кто-нибудь помочь мне с этим запросом:

SELECT su.name,su.imdb , su.id, su.owner, COUNT(*) AS count 
FROM subhits AS h LEFT JOIN subtitles AS su ON h.subid=su.id 
WHERE su.added BETWEEN '" . $lweek . "' AND '" . $today . "' 
GROUP BY h.subid 
ORDER BY count DESC LIMIT 15

ВОЗВРАТ:

name            imdb            id  owner   count
*Angels and Demons WTV  /title/tt0808151/   3337    3055    120
Terminator Salvation 2009   /title/tt0438488/   3539    26  120
Friday The 13th-WTV     /title/tt0758746/   3334    26  82
Night at the Museum     /title/tt1078912/   3548    7170    75
*Angels and Demons WTV2 /title/tt0808151/       3512    12  10

* Дублированный IMDB

Как вы видите, он возвращает результаты с тем же imdb. То, что я хотел бы сделать, это получить наибольшее количество, но исключить самое низкое значение imdb из результата.

Ответы [ 5 ]

0 голосов
/ 12 июня 2009

Я бы попробовал проверить это сам, но у меня нет ваших данных или хорошего образца для проверки.

SELECT su.name,su.imdb , su.id, su.owner, COUNT(*) AS counter
FROM subhits AS h LEFT JOIN subtitles AS su ON h.subid=su.id 
WHERE su.added BETWEEN '" . $lweek . "' AND '" . $today . "' 
GROUP BY h.subid 
having max(counter)
ORDER BY count DESC LIMIT 15
0 голосов
/ 12 июня 2009

Что мне нравится в MySQL по сравнению с Oracle, так это то, что другие поля, не входящие в GROUP BY, можно выбирать без использования функций группировки. Что делает запрос ниже, так это взять ваш запрос и сгруппировать его по imdb, который выбирает уникальный imdb с наибольшим количеством (который появится первым в порядке убывания в подвыборке). Попробуйте и посмотрите, работает ли он для вас.

SELECT name, imdb, id, owner, count
FROM 
(
 SELECT su.name,su.imdb , su.id, su.owner, COUNT(*) AS count 
 FROM subhits AS h LEFT JOIN subtitles AS su ON h.subid=su.id 
 WHERE su.added BETWEEN '" . $lweek . "' AND '" . $today . "' 
 GROUP BY h.subid
 ORDER BY count DESC
)
GROUP BY imdb
LIMIT 15
0 голосов
/ 11 июня 2009

Попробуйте это:

SELECT su.name
        , su.imdb
        , su.id
        , su.owner
        , (SELECT COUNT(*) FROM dbo.subhits AS h WHERE h.subid = su.id) AS count
    FROM dbo.subtitles AS su
    ORDER BY count DESC LIMIT 15

Редактировать: Используя предоставленную дополнительную информацию, я нашел почти рабочее решение, но застрял. Комбинируя ответ Криса Симпсона с частичным решением, я придумал это. Он избегает временных таблиц и содержит недостающие части, которые другой Крис не успел завершить. Я строю это в MSSQL, поэтому может потребоваться настройка для работы в MySQL. Я также не могу гарантировать, что информация будет правильной без ваших данных, но это может помочь.

SELECT a.id
        , (SELECT su.name FROM dbo.subtitles su WHERE a.id = su.id LIMIT 1)
        , a.imdb
        , (SELECT su.owner FROM dbo.subtitles su WHERE a.id = su.id LIMIT 1)
        , a.count
    FROM 
        (
            SELECT su.id
                    , su.imdb
                    , COUNT(*) AS count
                FROM dbo.subtitles su
                INNER JOIN dbo.subhits sh ON su.id = sh.subid
                GROUP BY su.id, su.imdb
        ) a
    INNER JOIN 
        (
            SELECT c.imdb
                    , MAX(c.count) AS maxCount
                FROM 
                    (
                        SELECT su.id
                                , su.imdb
                                , COUNT(*) AS count
                            FROM dbo.subtitles su
                            INNER JOIN dbo.subhits sh ON su.id = sh.subid
                            GROUP BY su.id, su.imdb
                    ) c
                GROUP BY c.imdb
        ) b ON a.imdb = b.imdb AND a.count = b.maxCount
    ORDER BY a.count DESC LIMIT 15
0 голосов
/ 12 июня 2009

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

select 
  imdb, 
  id, 
  count(*) as cnt
from subtitles  
group by 
  imdb, 
  id

.. во временную таблицу вы можете получить строки, которые вам действительно нужны:

select
  t.imdb,
  t.id,
  t.cnt
from MyTempTable t
  inner join
  (
    select
      imdb, 
      max(cnt) as maxcnt 
    from MyTempTable
    group by  
      imdb
  ) as drv on t.imdb = drv.imdb and t.cnt = drv.maxcnt

.. и результаты вышеупомянутого могут быть объединены в вашу основную таблицу без необходимости повторной группировки.

Помогает ли это?

Извините за то, что не вставил весь SQL, но у меня не хватает времени. Это будет делать то, что вы хотите, но все равно будет дублировать, если количество одинаково. Запрос может быть изменен, чтобы справиться с этим, если вы заботитесь об этом.

В отдельном примечании, я не уверен, почему вы остаетесь включенным в оператор, когда вы не показываете данные из левой таблицы?

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