按列y分组并返回列x中具有最低值的列

时间:2014-11-23 19:03:42

标签: mysql sql select group-by having

我的表格中包含idmailhitstime等列。

我希望获得最低hitstime值(最佳条目)的10个条目。

我使用过这样的东西:

SELECT * 
FROM tablename
ORDER BY hits, time ASC

在我的表中,有许多条目具有相同的mail地址,但我只想要10个具有不同邮件地址的条目。所以我尝试了group by语句,之后数据被混淆了。

如何选择具有不同hits地址的10个最佳条目(最低timemail)?

2 个答案:

答案 0 :(得分:1)

此查询我未进行测试,因为没有SQL-Fiddle示例或代码来复制数据。

但是试试这个疯狂的查询。

SET @prevMail = '', @rownum=0;
SELECT b.mail, b.time, b.hits 
FROM (
    SELECT  
    a.mail,
    a.time,
    a.hits,
    CASE WHEN @prevMail = a.mail THEN @rownum :=@rownum+1 ELSE @rownum :=1 END AS rowNum,
    @prevMail:=a.mail
    FROM (
        SELECT mail, time, SUM(hits) AS hits
        FROM tablename 
        GROUP BY mail, time
        ORDER BY mail, time, SUM(hits) ASC
    ) AS a
) AS b
WHERE b.rowNum <= 10;

以下是对查询的解释:

  1. 计算每个组合的总点击次数(邮件和时间),然后按此订单邮件,时间和总点击次数对其进行排序。
  2. 从第一步返回的列表中,我们检查查询的每一行,如果行中的电子邮件与上一行相同,那么我会增加行号,否则将其设置为1表示那里是一个新的组合开始。
  3. 上次查询只会为您提供每种组合的前10条记录。

答案 1 :(得分:0)

谢谢你们,但你的解决方案对我不起作用。但是你引导我朝着正确的方向前进:)

我发现了一些有用的东西

SELECT * 
FROM (
    SELECT * 
    FROM tablename
    ORDER BY hits ASC, time ASC 
) AS sub
GROUP BY mail