【问题标题】:Display random results ordered by date显示按日期排序的随机结果
【发布时间】:2014-02-04 07:34:07
【问题描述】:

这是我的数据库表结构:

---------------------------------- |编号 |标题 |日期 | ---------------------------------- | 001 |我的活动OO1 | 2014 年 4 月 2 日 | | 002 |我的活动OO2 | 2014 年 4 月 2 日 | | 003 |我的活动OO3 | 2014 年 4 月 2 日 | | 004 |我的活动OO4 | 2014 年 5 月 2 日 | | 005 |我的活动OO5 | 2014 年 5 月 2 日 | | 006 |我的活动OO6 | 2014 年 5 月 2 日 | | 007 |我的活动OO7 | 2014 年 5 月 2 日 | | 008 |我的活动OO8 | 2014 年 6 月 2 日 | | 009 |我的活动OO9 | 2014 年 6 月 2 日 | ----------------------------------

我成功地展示了它:

2014 年 4 月 2 日 - 我的活动 OO1 - 我的活动 OO2 - 我的活动OO3 2014 年 5 月 2 日 - 我的活动 OO4 - 我的活动 OO5 - 我的活动 OO6 - 我的活动 OO7 2014 年 6 月 2 日 - 我的活动 OO8 - 我的活动 OO9

但我想在每个日期随机显示 1 个结果(事件),例如:

2014 年 4 月 2 日 - 我的活动 OO2 2014 年 5 月 2 日 - 我的活动 OO6 2014 年 6 月 2 日 - 我的活动 OO8

在我的 sql 结果中,我尝试过 ORDER BY RAND() LIMIT 1 但当然我没有按日期排序 所以结果是随机排序的

那么,如何对日期进行排序并获得随机结果?

【问题讨论】:

    标签: sql random sql-order-by


    【解决方案1】:

    用途:

    SELECT d1.date, (
        SELECT d2.title 
        FROM table_1 d2 
        WHERE d2.date = d1.date 
        ORDER BY RAND()
        LIMIT 1
    ) AS title
    FROM table_1 d1 
    GROUP BY d1.date
    HAVING COUNT(d1.date)>=1
    ORDER BY d1.date ASC
    

    您唯一需要更改的是表的名称。确保在两个 FROM 子句中仅将 table_1 表到表的实际名称。

    这个想法是您检索日期,然后执行子查询以检索该日期内的随机事件,方法是从同一个表中选择并加入日期。

    【讨论】:

    • 我认为如果数据库中有记录,这将返回特定日期的多行。想法?
    • 这会为表中的每一行执行不必要的(浪费的)工作,而不是在每个不同的日期只执行一次。
    • 它也不会为只有 one 条目的任何日期返回行。
    【解决方案2】:
    SELECT distinct t1.date, 
        (SELECT t2.ID, t2.title 
        FROM mytable as t2 
        WHERE t2.date = t1.date 
        ORDER BY RAND()
        LIMIT 1) AS event_title
    FROM mytable as t1 
    ORDER BY t1.date;
    

    【讨论】:

    • 我尝试使用您的代码,但如果我想显示多个字段,我该怎么做:标题 - id - 日期
    【解决方案3】:

    一种方法

    SELECT e.* 
      FROM
    (
      SELECT
      (
        SELECT id
          FROM events
         WHERE date = d.date
         ORDER BY RAND()
         LIMIT 1
      ) id
        FROM
      (
        SELECT DISTINCT date
          FROM events
      ) d
    ) q JOIN events e 
        ON q.id = e.id
     ORDER BY date
    

    样本输出:

    |身份证 |标题 |日期 | |----|--------------|----------------------------- -| | 2 |我的活动OO2 | 2014 年 4 月 2 日 00:00:00+0000 | | 4 |我的活动OO4 | 2014 年 5 月 2 日 00:00:00+0000 | | 8 |我的活动OO8 | 2014 年 6 月 2 日 00:00:00+0000 |

    这里是SQLFiddle演示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2013-05-31
      • 2012-11-06
      • 1970-01-01
      • 2015-11-20
      • 2012-03-08
      相关资源
      最近更新 更多