2009-06-11 7 views
0

Может кто-то помочь мне с этим запросом:Distinct Популярные Хиты

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 из результата.

ответ

0

Что мне нравится в 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

С некоторыми трюками я сделал эту работу. Большое спасибо. И спасибо всем остальным :) – 2009-06-12 12:55:43

0

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

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 

Edit: Использование дополнительной информации, предоставленной мне было почти работающее решение, но застрял. Объединив ответ Криса Симпсона с частичным решением, я придумал это. Он избегает временных таблиц и имеет недостающие фрагменты, которые другой Крис не успел закончить. Я создаю это в 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

Вот что делает мой запрос, но он возвращает дублированный «su.imdb», и я не хочу, чтобы это произошло. В любом случае, спасибо – 2009-06-11 19:07:38

+0

Можете ли вы уточнить вопрос с более подробным объяснением того, что вы ожидаете от набора результатов? Я предположил, что imdb будет уникальным по названию.Если это не так, и вы группируете imdb, вы можете иметь идентификаторы и заголовки, которые не включены в набор результатов, и удары, относящиеся к ним, также будут исключены. Я уверен, что есть способ написать этот запрос, но вам нужно лучшее объяснение того, что вы хотите от данных. –

+0

Я отредактировал вопрос, надеюсь, что он станет более ясным. Спасибо – 2009-06-11 20:12:19

0

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

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

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

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

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

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 
Смежные вопросы