我看到了許多與此主題有關的主題,但在了解如何做到這一點上一直沒有成功。例如,如果我有此表:+------+-------+-------+| id | name | class |+------+-------+-------+| 5 | test | one | | 10 | test2 | one | | 12 | test5 | one | | 7 | test6 | two | +------+-------+-------+并且我只想顯示“一個”類中的X個隨機行,我該怎么做?注意:這是一張大桌子,所以我不想使用ORDER BY RAND。使用MySQL選擇隨機行
3 回答

偶然的你
TA貢獻1841條經(jīng)驗 獲得超3個贊
ORDER BY RAND()
如您所知,大多數(shù)人推薦的解決方案無法擴展到大型表。
SET @r := (SELECT FLOOR(RAND() * (SELECT COUNT(*) FROM mytable)));SET @sql := CONCAT('SELECT * FROM mytable LIMIT 1 OFFSET ', @r);PREPARE stmt1 FROM @sql;EXECUTE stmt1;
我在《SQL反模式:避免數(shù)據(jù)庫編程的陷阱》一書中介紹了該解決方案和其他解決方案。
如果要使用PHP進行此操作,則可以執(zhí)行以下操作(未測試):
<?php$mysqli->begin_transaction();$result = $mysqli->query("SELECT COUNT(*) FROM mytable")$row = $result->fetch_row(); $count = $row[0]; $offset = mt_rand(0, $count);$result = $mysqli->query("SELECT * FROM mytable LIMIT 1 OFFSET $offset");...$mysqli->commit();

汪汪一只貓
TA貢獻1898條經(jīng)驗 獲得超8個贊
select ID, NAME, CLASSfrom YOURTABLEwhere CLASS='one'order by rand()limit $x
排序rand()
不是特別有效,但這是最小/最快捷的方式。

寶慕林4294392
TA貢獻2021條經(jīng)驗 獲得超8個贊
SELECT * FROM `table` WHERE `class`="one" ORDER BY RAND() LIMIT 5
添加回答
舉報
0/150
提交
取消