MySQL随机排序分区

MySQL随机排序分区,mysql,sql,select,Mysql,Sql,Select,表1在我的数据库中有3列:id、category、timestamp。我需要查询每个类别中最新的3行: WITH ranked_rows AS (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS rn FROM table1 AS t) SELECT ranked_rows.* FROM ranked_rows WHERE rn<=3 现在我需要从结果中随机选择10个分区。

表1在我的数据库中有3列:id、category、timestamp。我需要查询每个类别中最新的3行:

WITH ranked_rows AS
(SELECT t.*, ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS rn
FROM table1 AS t)
SELECT ranked_rows.* FROM ranked_rows WHERE rn<=3

现在我需要从结果中随机选择10个分区。请注意,每个分区有3行。如何做到这一点?

有多种方法。一是:

WITH ranked_rows AS (
      SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS seqnum,
             DENSE_RANK() OVER (ORDER BY MD5(category)) as catnum
      FROM table1 t
     )
SELECT ranked_rows.*
FROM ranked_rows
WHERE seqnum <= 3 AND catnum <= 10;

md5只会使结果看起来随机。

如果您希望每个类别都是真正随机的,这里有一种方法:

with categorycte as (
  select category , rand() randomcatid
  from table1
  group by category
),ranked_rows AS
(
  SELECT t.*
  , ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS rn
  , dense_rank() over (order by randomcatid) catnum
FROM table1 AS t
join categorycte c on t.category = c.category
)
SELECT ranked_rows.* FROM ranked_rows 
WHERE rn<=3 and catnum <= 10;

非常感谢!但是每次我运行这个查询时,每个分区的catnum值都不会改变,因此结果是常量。@Soheil。这可能是一个特性,但您现在可以对md5:md5concatcatcatcategory添加盐。