簡體   English   中英

如何在mysql中使用parent_id選擇Random?

[英]How Select Random with parent_id in mysql?

我有這樣的桌子......

╔═════╦════════╦═════════════╗
║ id  ║  text  ║  parent_id  ║
╠═════╬════════╬═════════════╣
║   1 ║  test  ║           1 ║
║   2 ║  asd   ║           1 ║
║   3 ║  dsa   ║           1 ║
║   4 ║  fgh   ║           4 ║
║   5 ║  jkl   ║           4 ║
║   6 ║  kkk   ║           4 ║
║   7 ║  asas  ║           7 ║
╚═════╩════════╩═════════════╝

如何獲得隨機輸出:

╔═════╦════════╦═════════════╗
║ id  ║  text  ║  parent_id  ║
╠═════╬════════╬═════════════╣
║   4 ║  fgh   ║           4 ║
║   5 ║  jkl   ║           4 ║
║   6 ║  kkk   ║           4 ║
║   7 ║  asas  ║           7 ║
║   1 ║  test  ║           1 ║
║   2 ║  asd   ║           1 ║
║   3 ║  dsa   ║           1 ║
╚═════╩════════╩═════════════╝

要么

╔═════╦════════╦═════════════╗
║ id  ║  text  ║  parent_id  ║
╠═════╬════════╬═════════════╣
║   7 ║  asas  ║           7 ║
║   4 ║  fgh   ║           4 ║
║   5 ║  jkl   ║           4 ║
║   6 ║  kkk   ║           4 ║
║   1 ║  test  ║           1 ║
║   2 ║  asd   ║           1 ║
║   3 ║  dsa   ║           1 ║
╚═════╩════════╩═════════════╝

等等....

SELECT *
FROM Table1
ORDER BY parent_id * rand()

稍微更新基於@sagi的ans,附加組的行順序保證。

這是演示。

SQL:

-- data
create table tbl(id int, text char(20), parent_id int);
insert into tbl values
(1 , 'test', 1 ),
(2 , 'asd',  1 ),
(3 , 'dsa',  1 ),
(4 , 'fgh',  4 ),
(5 , 'jkl',  4 ),
(6 , 'kkk',  4 ),
(7 , 'asas', 7 );
select * from tbl;

select t.* 
from tbl t inner join 
    (select parent_id, rand() rand_val from tbl group by parent_id) r
    USING(parent_id)
order by rand_val, id;

輸出:

mysql> select t.*  from tbl t inner join      (select parent_id, rand() rand_val from tbl group by parent_id) r     USING(parent_id) order by rand_val, id;
+------+------+-----------+
| id   | text | parent_id |
+------+------+-----------+
|    7 | asas |         7 |
|    4 | fgh  |         4 |
|    5 | jkl  |         4 |
|    6 | kkk  |         4 |
|    1 | test |         1 |
|    2 | asd  |         1 |
|    3 | dsa  |         1 |
+------+------+-----------+
7 rows in set (0.00 sec)

mysql> select t.*  from tbl t inner join      (select parent_id, rand() rand_val from tbl group by parent_id) r     USING(parent_id) order by rand_val, id;
+------+------+-----------+
| id   | text | parent_id |
+------+------+-----------+
|    4 | fgh  |         4 |
|    5 | jkl  |         4 |
|    6 | kkk  |         4 |
|    1 | test |         1 |
|    2 | asd  |         1 |
|    3 | dsa  |         1 |
|    7 | asas |         7 |
+------+------+-----------+
7 rows in set (0.00 sec)

你可以使用子查詢來完成它,類似於Juan解決方案:

SELECT s.* FROM YourTable s
INNER JOIN (select parent_id,max(rand()) as randVal FROM YourTable GROUP BY parent_id) t
 ON(s.parent_id = t.parent_id)
ORDER BY t.randVal

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM