【问题标题】:random 2 records according to position and order by position根据位置和按位置顺序随机2条记录
【发布时间】:2016-02-12 12:47:00
【问题描述】:

question_tbl: q_id(int) PK、位置(int)、q_type(varchar(255))、问题(varchar(255))、级别(int)

我试过的查询:

SELECT q_id, position, q_type, question, level
FROM (SELECT * FROM tbl_question ORDER BY rand()) a
WHERE level = '1'
ORDER BY position

得到以下结果:

q_id    position    qtn     level
1           1       demo      1
2           1       demo12    1
3           1       demo21    1
4           2       demo22    1
5           2       demo11    1
6           2       demo31    1
7           3       demo41    1
8           3       demo51    1
9           4       demo61    1
10          1       demo71    1
11          1       demo81    1
12          2       demo91    1
13          3       demo511   1
14          4       demo514   1
15          4       demo4511  1

预期结果: 根据位置和位置顺序随机2条记录如下:

q_id    position    qtn     level
2           1       demo12    1
3           1       demo21    1
4           2       demo22    1
5           2       demo11    1
7           3       demo41    1
8           3       demo51    1
9           4       demo61    1
15          4       demo4511  1

希望按位置随机 2 条记录

【问题讨论】:

  • 请提供您的表结构。最好也提供一些insert statements
  • @SubrataDeyPappu 查看更新后的问题
  • 让我检查一下如果我理解你的问题:你想要每个位置的 2 条记录随机。对吗?
  • @SubrataDeyPappu 是的。
  • @Shadow 不重复,这已经是我的问题了。阅读两个问题

标签: mysql


【解决方案1】:

您可以按position, rand() 排序,以便在每个position 分区内随机排序。然后使用变量枚举position分区的记录:

SELECT q_id, position, qtn, level, rn
FROM (
  SELECT q_id, position, qtn, level,
           @rn := IF(@pos = position, @rn + 1,
                   IF(@pos := position, 1, 1)) AS rn
  FROM (
    SELECT *
    FROM tbl_question     
    WHERE level = '1'
    ORDER BY position, rand() ) a
  CROSS JOIN (SELECT @rn := 0, @pos := 0) AS vars ) b
WHERE b.rn <= 2  
ORDER BY position

外部查询使用@rn 从每个position 分区中仅选择两条记录。

Demo here

【讨论】:

    【解决方案2】:

    你只是随机化然后重新排序整个集合。

    你只想要 2 行对吗?

    所以使用 LIMIT 2 在你的内部查询中只得到 2 个

    SELECT q_id, position, q_type, question, level
    FROM (SELECT * FROM tbl_question ORDER BY rand() LIMIT 2) a
    WHERE level = '1'
    ORDER BY position
    

    我想这就是你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多