独特的热门歌曲

时间:2009-06-11 17:23:52

标签: mysql

有人可以帮我解决这个问题:

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 :(得分:0)

答案 1 :(得分: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

编辑:使用提供的其他信息,我有一个几乎可行的解决方案,但卡住了。结合Chris Simpson的答案和部分解决方案,我想出了这个。它避免了临时表,并且缺少其他Chris没有时间完成的部分。我在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

答案 2 :(得分:0)

我不想这么说,但这是临时表可能有帮助的极少数情况之一。如果你把结果放在:

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都放进去,但是时间紧迫了。这将执行您想要的操作,但如果计数相同,仍会重复。如果您关心它,可以修改查询以处理此问题。

另外,当你没有从左手表中显示任何数据时,我不确定为什么你还要加入声明?

答案 3 :(得分:0)

与Oracle相比,我喜欢MySQL,不使用分组功能就可以选择其他不属于GROUP BY的字段。下面的查询执行的是查询并通过imdb对其进行分组,imdb选择具有最高计数的唯一imdb(在subselect中将首先出现在降序排序中)。试一试,看看它是否适合你。

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

答案 4 :(得分: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