1

我有这样的表:

AdID | Hits | CreatedOn
1, 20, 2013-08-28 18:18:42
2, 12, 2013-08-28 13:34:42
3, 12, 2013-08-27 11:34:42
4, 14, 2013-08-27 02:34:42
5, 12, 2013-08-26 11:34:42
6, 12, 2013-08-26 02:34:42

我想要的结果会是这样的:

1, 20, 2013-08-28
4, 14, 2013-08-27
5, 12, 2013-08-26

基本上它会选择每个日期的最多历史,如果它是相同的 HITS,它将选择 AdID 的顶部

如何在 mySQL 中执行此操作?

4

4 回答 4

3

由于您需要从日期中提取时间,因此执行速度会慢一些,但会为您提供所需的结果。

SELECT  a.AdID, a.Hits, DATE(a.CreatedON) CreatedON
FROM        tableName a
        INNER JOIN
        (
            SELECT  DATE(CreatedON) CreatedON,
                    MAX(Hits) Hits 
            FROM    tableName
            GROUP   BY DATE(CreatedON)
        ) b ON a.Hits = b.Hits AND  
                DATE(a.CreatedON) = b.CreatedON
于 2013-08-22T07:45:35.397 回答
1

询问:

SQLFIDDLE示例

SELECT  a.AdID, a.Hits, DATE(a.CreatedOn) CreatedON
FROM tableName a
WHERE a.AdID = (SELECT b.adID
                FROM tableName b
                WHERE DATE(b.CreatedOn) = DATE(a.CreatedOn)
                ORDER BY b.Hits DESC, b.adID ASC
                LIMIT 1)  

结果:

| ADID | HITS |                     CREATEDON |
-----------------------------------------------
|    1 |   20 | August, 28 2013 00:00:00+0000 |
|    4 |   14 | August, 27 2013 00:00:00+0000 |
|    5 |   12 | August, 26 2013 00:00:00+0000 |
于 2013-08-22T08:04:37.477 回答
0

如果我理解正确,你想GROUP BY点击,然后选择最低或最高的 ID,所以你需要两件事:一个组和排序:

SELECT AdID FROM table GROUP BY Hits ORDER BY AdID ASC LIMIT 1

这将为点击次数最多的组提供最低的 AdID。如果想要最高的AdID,需要ASCDESCofcource切换

于 2013-08-22T07:45:50.223 回答
0
SELECT *
FROM TableName T1
WHERE ( SELECT count(*)
        FROM TableName T2
        WHERE      (T2.Hits < T1.Hits OR (T2.Hits=T1.Hits AND T2.AdID < T1.AdID)) 
               AND  DATE(T2.CreatedOn)=DATE(T1.CreatedOn)
      ) < 1

这样,您可以为每个日期选择第 2、第 3、前 3 等。

检查这个有趣的链接:http ://www.xaprb.com/blog/2008/08/08/how-to-select-the-nth-greatestlastfirstlast-row-in-sql/

于 2013-08-22T08:10:49.487 回答