Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Đã hỏi 11 năm, 11 tháng trước 11 years, 11 months ago

Đã xem 550k lần 550k times

Làm thế nào tôi có thể viết tốt nhất một truy vấn chọn 10 hàng ngẫu nhiên từ tổng số 600k?

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Peter O.

31.5K14 Huy hiệu vàng77 Huy hiệu bạc92 Huy hiệu Đồng14 gold badges77 silver badges92 bronze badges

Đã hỏi ngày 1 tháng 12 năm 2010 lúc 21:35Dec 1, 2010 at 21:35

FranciscfranciscFrancisc

74.6K61 Huy hiệu vàng177 Huy hiệu bạc273 Huy hiệu Đồng61 gold badges177 silver badges273 bronze badges

2

Một bài viết tuyệt vời xử lý một số trường hợp, từ đơn giản, đến khoảng trống, không đồng đều với các khoảng trống.

http://jan.kneschke.de/projects/mysql/order-by-rand/

Đối với hầu hết các trường hợp chung, đây là cách bạn làm điều đó:

SELECT name
  FROM random AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM random)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1

Điều này cho rằng việc phân phối ID là bằng nhau và có thể có những khoảng trống trong danh sách ID. Xem bài viết để biết các ví dụ nâng cao hơn

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Squazz

3,8026 Huy hiệu vàng36 Huy hiệu bạc56 Huy hiệu Đồng6 gold badges36 silver badges56 bronze badges

Đã trả lời ngày 1 tháng 12 năm 2010 lúc 21:41Dec 1, 2010 at 21:41

16

SELECT column FROM table
ORDER BY RAND()
LIMIT 10

Không phải là giải pháp hiệu quả nhưng hoạt động

Đã trả lời ngày 13 tháng 10 năm 2012 lúc 6:43Oct 13, 2012 at 6:43

Preetam purbiapreetam purbiaPreetam Purbia

5.5783 Huy hiệu vàng22 Huy hiệu bạc26 Huy hiệu đồng3 gold badges22 silver badges26 bronze badges

7

Truy vấn đơn giản có hiệu suất tuyệt vời và hoạt động với các khoảng trống:excellent performance and works with gaps:

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id

Truy vấn này trên bảng 200K mất 0,08 giây và phiên bản bình thường (chọn * từ thứ tự tbl bởi rand () giới hạn 10) mất 0,35s trên máy của tôi.0.08s and the normal version (SELECT * FROM tbl ORDER BY RAND() LIMIT 10) takes 0.35s on my machine.

Điều này là nhanh vì pha sắp xếp chỉ sử dụng cột ID được lập chỉ mục. Bạn có thể thấy hành vi này trong giải thích:

Chọn * Từ đơn đặt hàng TBL của Rand () Giới hạn 10:

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Chọn * Từ TBL dưới dạng T1 Tham gia (chọn ID từ đơn đặt hàng TBL của Rand () giới hạn 10) là T2 trên T1.ID = T2.ID

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Phiên bản có trọng số: https://stackoverflow.com/a/41577458/893432: https://stackoverflow.com/a/41577458/893432

Đã trả lời ngày 11 tháng 1 năm 2017 lúc 0:53Jan 11, 2017 at 0:53

AlialiAli

20.6K14 Huy hiệu vàng81 Huy hiệu bạc95 Huy hiệu Đồng14 gold badges81 silver badges95 bronze badges

1

Tôi đang nhận được các truy vấn nhanh (khoảng 0,5 giây) với CPU chậm, chọn 10 hàng ngẫu nhiên trong 400K đăng ký cơ sở dữ liệu MySQL không kích thước 2GB. Xem ở đây Mã của tôi: Lựa chọn nhanh các hàng ngẫu nhiên trong MySQLfast queries (around 0.5 seconds) with a slow cpu, selecting 10 random rows in a 400K registers MySQL database non-cached 2Gb size. See here my code: Fast selection of random rows in MySQL

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Giacomo1968

25.3k11 Huy hiệu vàng70 Huy hiệu bạc99 Huy hiệu đồng11 gold badges70 silver badges99 bronze badges

Đã trả lời ngày 2 tháng 8 năm 2011 lúc 0:30Aug 2, 2011 at 0:30

SnippetsofCodesNippetsofCodesnippetsofcode

9372 Huy hiệu vàng10 Huy hiệu bạc10 Huy hiệu đồng2 gold badges10 silver badges10 bronze badges

8

Từ cuốn sách:

Chọn một hàng ngẫu nhiên bằng cách sử dụng một phần bù

Vẫn là một kỹ thuật khác để tránh các vấn đề được tìm thấy trong các lựa chọn thay thế trước là đếm các hàng trong tập dữ liệu và trả về một số ngẫu nhiên giữa 0 và số đếm. Sau đó sử dụng số này làm phần bù khi truy vấn tập dữ liệu

$rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
$offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
$sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
$stmt = $pdo->prepare($sql);
$stmt->execute( $offset );
$rand_bug = $stmt->fetch();

Sử dụng giải pháp này khi bạn có thể giả định các giá trị khóa liên tục và bạn cần đảm bảo mỗi hàng có cơ hội được chọn chẵn.

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Giacomo1968

25.3k11 Huy hiệu vàng70 Huy hiệu bạc99 Huy hiệu đồng11 gold badges70 silver badges99 bronze badges

Đã trả lời ngày 2 tháng 8 năm 2011 lúc 0:30Jun 26, 2015 at 6:07

SnippetsofCodesNippetsofCodezloctb

9372 Huy hiệu vàng10 Huy hiệu bạc10 Huy hiệu đồng6 gold badges67 silver badges86 bronze badges

2

Từ cuốn sách:

SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;

Chọn một hàng ngẫu nhiên bằng cách sử dụng một phần bùJan 13, 2016 at 14:20

Vẫn là một kỹ thuật khác để tránh các vấn đề được tìm thấy trong các lựa chọn thay thế trước là đếm các hàng trong tập dữ liệu và trả về một số ngẫu nhiên giữa 0 và số đếm. Sau đó sử dụng số này làm phần bù khi truy vấn tập dữ liệuMuhammad Azeem

Sử dụng giải pháp này khi bạn có thể giả định các giá trị khóa liên tục và bạn cần đảm bảo mỗi hàng có cơ hội được chọn chẵn.1 gold badge12 silver badges16 bronze badges

4

Đã trả lời ngày 26 tháng 6 năm 2015 lúc 6:07

Zloctbzloctb

10k6 huy hiệu vàng67 Huy hiệu bạc86 Huy hiệu đồng

SELECT *
FROM random, (
        SELECT id AS sid
        FROM random
        ORDER BY RAND( )
        LIMIT 10
    ) tmp
WHERE random.id = tmp.sid;

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Truy vấn dòng rất đơn giản và đơn lẻ của nó.Jul 20, 2013 at 1:34

user1931858user1931858user1931858

Đã trả lời ngày 13 tháng 1 năm 2016 lúc 14:201 gold badge16 silver badges6 bronze badges

2

Muhammad Azeemmuhammad Azeem

1.1101 Huy hiệu vàng12 Huy hiệu bạc16 Huy hiệu đồng

SELECT * FROM table WHERE key >= FLOOR(RAND()*MAX(id)) LIMIT 1

Cách chọn các hàng ngẫu nhiên từ bảng:

Từ đây: Chọn Hàng ngẫu nhiên trong MySQL

Cải thiện nhanh chóng về "quét bảng" là sử dụng chỉ mục để chọn ID ngẫu nhiên.

Đã trả lời ngày 20 tháng 7 năm 2013 lúc 1:34

102K1 Huy hiệu vàng16 Huy hiệu bạc6 Huy hiệu đồng

Chà, nếu bạn không có khoảng trống trong các khóa của mình và tất cả chúng đều có số bạn có thể tính toán các số ngẫu nhiên và chọn các dòng đó. Nhưng điều này có lẽ sẽ không phải là trường hợp.

Vì vậy, một giải pháp sẽ là như sau:

về cơ bản sẽ đảm bảo rằng bạn có được một số ngẫu nhiên trong phạm vi khóa của mình và sau đó bạn chọn số tốt nhất tiếp theo lớn hơn. Bạn phải làm điều này 10 lần.

Tuy nhiên, điều này không thực sự ngẫu nhiên vì các khóa của bạn rất có thể sẽ không được phân phối đều.Dec 1, 2010 at 21:46

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Đó thực sự là một vấn đề lớn và không dễ để giải quyết thực hiện tất cả các yêu cầu, mysql () là tốt nhất bạn có thể nhận được nếu bạn thực sự muốn 10 hàng ngẫu nhiên.The Surrican

Tuy nhiên, có một giải pháp khác nhanh nhưng cũng có sự đánh đổi khi nói đến sự ngẫu nhiên, nhưng có thể phù hợp với bạn hơn. Đọc về nó ở đây: Làm thế nào tôi có thể tối ưu hóa hàm của MySQL theo hàm rand ()?24 gold badges118 silver badges168 bronze badges

6

Câu hỏi là bạn cần nó ngẫu nhiên như thế nào.with gaps (tested on getting 1000 random rows from a table that has > 2.6B rows).

(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max := (SELECT MAX(id) FROM table)) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
(SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1)

Bạn có thể giải thích thêm một chút để tôi có thể cung cấp cho bạn một giải pháp tốt.

  1. $rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
    $offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
    $sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
    $stmt = $pdo->prepare($sql);
    $stmt->execute( $offset );
    $rand_bug = $stmt->fetch();
    
    2
    • Tôi đang tính toán và lưu tối đa. Đối với các bảng rất lớn, có một chi phí nhỏ để tính toán
      $rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
      $offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
      $sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
      $stmt = $pdo->prepare($sql);
      $stmt->execute( $offset );
      $rand_bug = $stmt->fetch();
      
      3 mỗi lần bạn cần một hàng
  2. $rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
    $offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
    $sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
    $stmt = $pdo->prepare($sql);
    $stmt->execute( $offset );
    $rand_bug = $stmt->fetch();
    
    4
    • Nhận ID ngẫu nhiên
  3. $rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
    $offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
    $sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
    $stmt = $pdo->prepare($sql);
    $stmt->execute( $offset );
    $rand_bug = $stmt->fetch();
    
    5
    • Điều này lấp đầy các khoảng trống. Về cơ bản nếu bạn chọn ngẫu nhiên một số trong các khoảng trống, nó sẽ chỉ chọn ID tiếp theo. Giả sử các khoảng trống được phân phối đồng đều, đây không phải là vấn đề.

Thực hiện công đoàn giúp bạn phù hợp với mọi thứ vào 1 truy vấn để bạn có thể tránh thực hiện nhiều truy vấn. Nó cũng cho phép bạn tiết kiệm chi phí tính toán

$rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
$offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
$sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
$stmt = $pdo->prepare($sql);
$stmt->execute( $offset );
$rand_bug = $stmt->fetch();
3. Tùy thuộc vào ứng dụng của bạn, điều này có thể quan trọng rất nhiều hoặc rất ít.

Lưu ý rằng điều này chỉ nhận được ID và nhận chúng theo thứ tự ngẫu nhiên. Nếu bạn muốn làm bất cứ điều gì nâng cao hơn, tôi khuyên bạn nên làm điều này:

SELECT t.id, t.name -- etc, etc
FROM table t
INNER JOIN (
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max := (SELECT MAX(id) FROM table)) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1) UNION
    (SELECT id FROM table INNER JOIN (SELECT FLOOR(RAND() * @max) + 1 as rand) r on id > rand LIMIT 1)
) x ON x.id = t.id
ORDER BY t.id

Đã trả lời ngày 28 tháng 3 năm 2017 lúc 23:45Mar 28, 2017 at 23:45

Hans Zhans zHans Z

4.5742 Huy hiệu vàng25 Huy hiệu bạc48 Huy hiệu đồng2 gold badges25 silver badges48 bronze badges

5

Tất cả các câu trả lời tốt nhất đã được đăng (chủ yếu là những câu trả lời liên kết http://jan.kneschke.de/projects/mysql/order-by-by-rand/).

Tôi muốn xác định một khả năng tăng tốc khác - bộ nhớ đệm. Hãy nghĩ về lý do tại sao bạn cần có được các hàng ngẫu nhiên. Có lẽ bạn muốn hiển thị một số bài đăng ngẫu nhiên hoặc quảng cáo ngẫu nhiên trên một trang web. Nếu bạn nhận được 100 req/s, có thực sự cần thiết mà mỗi khách truy cập nhận được hàng ngẫu nhiên không? Thông thường, việc lưu trữ các hàng ngẫu nhiên x này là hoàn toàn tốt trong 1 giây (hoặc thậm chí 10 giây). Sẽ không có vấn đề gì nếu 100 khách truy cập duy nhất trong cùng 1 giây có cùng một bài đăng ngẫu nhiên, bởi vì 100 khách truy cập tiếp theo khác sẽ nhận được các bài đăng khác nhau.caching. Think of why you need to get random rows. Probably you want display some random post or random ad on a website. If you are getting 100 req/s, is it really needed that each visitor gets random rows? Usually it is completely fine to cache these X random rows for 1 second (or even 10 seconds). It doesn't matter if 100 unique visitors in the same 1 second get the same random posts, because the next second another 100 visitors will get different set of posts.

Khi sử dụng bộ đệm này, bạn cũng có thể sử dụng một số giải pháp chậm hơn để lấy dữ liệu ngẫu nhiên vì nó sẽ được tìm nạp từ MySQL chỉ một lần mỗi giây bất kể REQ/s của bạn.

Đã trả lời ngày 7 tháng 7 năm 2015 lúc 13:52Jul 7, 2015 at 13:52

Marki555Marki555Marki555

6.1803 Huy hiệu vàng35 Huy hiệu bạc58 Huy hiệu Đồng3 gold badges35 silver badges58 bronze badges

0

Tôi đã xem qua tất cả các câu trả lời, và tôi không nghĩ có ai đề cập đến khả năng này, và tôi không chắc tại sao.

Nếu bạn muốn có sự đơn giản và tốc độ tối đa, với chi phí nhỏ, thì với tôi dường như có ý nghĩa để lưu trữ một số ngẫu nhiên so với mỗi hàng trong DB. Chỉ cần tạo một cột bổ sung,

$rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
$offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
$sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
$stmt = $pdo->prepare($sql);
$stmt->execute( $offset );
$rand_bug = $stmt->fetch();
7 và đặt mặc định thành
$rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
$offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
$sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
$stmt = $pdo->prepare($sql);
$stmt->execute( $offset );
$rand_bug = $stmt->fetch();
8. Tạo một chỉ mục trên cột này.

Sau đó, khi bạn muốn truy xuất một hàng tạo một số ngẫu nhiên trong mã của bạn (PHP, perl, bất cứ điều gì) và so sánh nó với cột.

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
0

Tôi đoán mặc dù nó rất gọn gàng cho một hàng, nhưng trong mười hàng như OP đã yêu cầu bạn phải gọi nó là mười lần riêng biệt (hoặc đưa ra một tinh chỉnh thông minh thoát khỏi tôi ngay lập tức)

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Giacomo1968

25.3k11 Huy hiệu vàng70 Huy hiệu bạc99 Huy hiệu đồng11 gold badges70 silver badges99 bronze badges

Đã trả lời ngày 25 tháng 6 năm 2018 lúc 12:00Jun 25, 2018 at 12:00

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

CodemonKeyCodemonkeyCodemonkey

4.2995 Huy hiệu vàng40 Huy hiệu bạc73 Huy hiệu đồng5 gold badges40 silver badges73 bronze badges

6

Tôi cần một truy vấn để trả lại một số lượng lớn các hàng ngẫu nhiên từ một bảng khá lớn. Đây là những gì tôi nghĩ ra. Đầu tiên hãy nhận ID bản ghi tối đa:

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
1

Sau đó thay thế giá trị đó thành:

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
2

Trong đó MAX là ID bản ghi tối đa trong bảng và n là số lượng hàng bạn muốn trong bộ kết quả của mình. Giả định là không có lỗ hổng trong ID hồ sơ mặc dù tôi nghi ngờ nó sẽ ảnh hưởng đến kết quả nếu có (mặc dù không thử nó). Tôi cũng đã tạo ra thủ tục được lưu trữ này để trở nên chung chung hơn; vượt qua tên bảng và số lượng hàng sẽ được trả về. Tôi đang chạy MySQL 5.5.38 trên Windows 2008, 32GB, Dual 3Ghz E5450 và trên bàn với 17.361.264 hàng, nó khá phù hợp ở mức ~ 0,03 giây / ~ 11 giây để trả lại 1.000.000 hàng. .

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
3

sau đó

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
4

Đã trả lời ngày 24 tháng 9 năm 2014 lúc 13:47Sep 24, 2014 at 13:47

Đây là một người thay đổi trò chơi có thể hữu ích cho nhiều người;

Tôi có một bảng với các hàng 200k, với ID tuần tự, tôi cần chọn n hàng ngẫu nhiên, vì vậy tôi chọn tạo các giá trị ngẫu nhiên dựa trên ID lớn nhất trong bảng, tôi đã tạo tập lệnh này để tìm ra hoạt động nhanh nhất:with sequential id's, I needed to pick N random rows, so I opt to generate random values based in the biggest ID in the table, I created this script to find out which is the fastest operation:

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
5

Kết quả là:

  • Đếm:
    $rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
    $offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
    $sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
    $stmt = $pdo->prepare($sql);
    $stmt->execute( $offset );
    $rand_bug = $stmt->fetch();
    
    9 ms
  • Tối đa:
    SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
    
    0 ms
  • Đặt hàng:
    SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
    
    1 MS

Dựa trên kết quả này, Order Desc là hoạt động nhanh nhất để có được ID tối đa, đây là câu trả lời của tôi cho câu hỏi:
Here is my answer to the question:

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
6

FYI: Để có được 10 hàng ngẫu nhiên từ bảng 200K, tôi đã mất 1,78 ms (bao gồm tất cả các hoạt động ở phía PHP)ms (including all the operations in the php side)

Đã trả lời ngày 15 tháng 5 năm 2015 lúc 11:05May 15, 2015 at 11:05

António Almeidaantónio AlmeidaAntónio Almeida

9.2658 Huy hiệu vàng59 Huy hiệu bạc65 Huy hiệu Đồng8 gold badges59 silver badges65 bronze badges

1

Tôi đã sử dụng http://jan.kneschke.de/projects/mysql/order-by-by-rand/ được đăng bởi riedsio (Tôi đã sử dụng trường hợp quy trình được lưu trữ trả về một hoặc nhiều giá trị ngẫu nhiên):

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
7

Trong bài viết, ông giải quyết vấn đề về các khoảng trống trong ID gây ra kết quả không ngẫu nhiên bằng cách duy trì bảng (sử dụng trình kích hoạt, v.v ... xem bài viết); Tôi đang giải quyết vấn đề bằng cách thêm một cột khác vào bảng, được điền với các số tiếp giáp, bắt đầu từ 1 (Chỉnh sửa: Cột này được thêm vào bảng tạm thời được tạo bởi trình điều khiển con khi chạy, không ảnh hưởng đến bảng vĩnh viễn của bạn):problem of gaps in ids causing not so random results by maintaining a table (using triggers, etc...see the article); I'm solving the problem by adding another column to the table, populated with contiguous numbers, starting from 1 (edit: this column is added to the temporary table created by the subquery at runtime, doesn't affect your permanent table):

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
8

Trong bài viết tôi có thể thấy anh ấy đã cố gắng hết sức để tối ưu hóa mã; Tôi không có IDEEA nếu/những thay đổi của tôi ảnh hưởng đến hiệu suất nhưng hoạt động rất tốt với tôi.

Westy92

17.2k3 Huy hiệu vàng68 Huy hiệu bạc49 Huy hiệu đồng3 gold badges68 silver badges49 bronze badges

Đã trả lời ngày 28 tháng 8 năm 2012 lúc 17:13Aug 28, 2012 at 17:13

Bogdanbogdanbogdan

1.2593 huy hiệu vàng12 Huy hiệu bạc18 Huy hiệu đồng3 gold badges12 silver badges18 bronze badges

1

Đây là siêu nhanh và ngẫu nhiên 100% ngay cả khi bạn có khoảng trống.

  1. Đếm số
    SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
    
    2 của các hàng mà bạn có sẵn
    SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
    
    3
  2. Chọn 10 số ngẫu nhiên riêng biệt
    SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
    
    4 trong khoảng từ 0 đến
    SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
    
    2
  3. Truy vấn các hàng của bạn như thế này:
    SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
    
    6 cho i = 1, ..., 10

Tôi đã tìm thấy bản hack này trong cuốn sách SQL Antipatterns từ Bill Karwin.

Đã trả lời ngày 21 tháng 2 năm 2019 lúc 14:55Feb 21, 2019 at 14:55

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

AdamadamAdam

Phim thương hiệu vàng 23K2020 gold badges136 silver badges221 bronze badges

5

Sau đây phải nhanh chóng, không thiên vị và độc lập với cột ID. Tuy nhiên, nó không đảm bảo rằng số lượng hàng được trả về sẽ khớp với số lượng hàng được yêu cầu.However it does not guarantee that the number of rows returned will match the number of rows requested.

SELECT column FROM table
ORDER BY RAND()
LIMIT 10
9

Giải thích: Giả sử bạn muốn 10 hàng trong số 100 hàng sau đó mỗi hàng có xác suất 1/10 được chọn có thể đạt được bằng

SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
7. Cách tiếp cận này không đảm bảo 10 hàng; Nhưng nếu truy vấn được chạy đủ lần, số lượng hàng trung bình cho mỗi lần thực thi sẽ vào khoảng 10 và mỗi hàng trong bảng sẽ được chọn đều.

Đã trả lời ngày 30 tháng 4 năm 2019 lúc 8:38Apr 30, 2019 at 8:38

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Salman Asalman aSalman A

253K80 Huy hiệu vàng425 Huy hiệu bạc513 Huy hiệu Đồng80 gold badges425 silver badges513 bronze badges

Bạn có thể dễ dàng sử dụng một bù ngẫu nhiên với giới hạn

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
0

Bạn cũng có thể áp dụng một mệnh đề WHERE như vậy

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
1

Được thử nghiệm trên 600.000 hàng (700MB) Thực thi truy vấn bảng đã mất ~ 0,016 giây ổ cứng ổ cứng.

EDIT: Phần bù có thể mất giá trị gần cuối bảng, điều này sẽ dẫn đến câu lệnh Chọn trả về các hàng ít hơn (hoặc có thể chỉ có 1 hàng), để tránh điều này, chúng ta có thể kiểm tra lại

SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
8 sau khi khai báo nó, như vậy: The offset might take a value close to the end of the table, which will result in the select statement returning less rows (or maybe only 1 row), to avoid this we can check the
SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
8 again after declaring it, like so

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
2

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Giacomo1968

25.3k11 Huy hiệu vàng70 Huy hiệu bạc99 Huy hiệu đồng11 gold badges70 silver badges99 bronze badges

Đã trả lời ngày 30 tháng 1 năm 2020 lúc 8:30Jan 30, 2020 at 8:30

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

EboubakereboubakerEboubaker

5006 Huy hiệu bạc15 Huy hiệu Đồng6 silver badges15 bronze badges

Tôi biết đó không phải là những gì bạn muốn, nhưng câu trả lời tôi sẽ cung cấp cho bạn là những gì tôi sử dụng trong sản xuất trong một trang web nhỏ.

Tùy thuộc vào số lần bạn truy cập giá trị ngẫu nhiên, không đáng để sử dụng MySQL, chỉ vì bạn sẽ không thể lưu trữ câu trả lời. Chúng tôi có một nút ở đó để truy cập một trang ngẫu nhiên và người dùng có thể nhấp vào đó nhiều lần mỗi phút nếu anh ta muốn. Điều này sẽ gây ra một lượng lớn việc sử dụng MySQL và, ít nhất là đối với tôi, MySQL là vấn đề lớn nhất để tối ưu hóa.

Tôi sẽ đi một cách tiếp cận khác, nơi bạn có thể lưu trữ trong bộ đệm câu trả lời. Thực hiện một cuộc gọi cho MySQL của bạn:

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
3

Với ID tối đa và tối đa của bạn, trong máy chủ của bạn, tính toán một số ngẫu nhiên. Trong Python:

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
4

Sau đó, với số ngẫu nhiên của bạn, bạn có thể nhận được ID ngẫu nhiên trong bảng của mình:

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
5

Trong phương thức này, bạn thực hiện hai cuộc gọi đến cơ sở dữ liệu của mình, nhưng bạn có thể lưu trữ chúng và không truy cập cơ sở dữ liệu trong một thời gian dài, nâng cao hiệu suất. Lưu ý rằng đây không phải là ngẫu nhiên nếu bạn có lỗ trong bảng của mình. Có nhiều hơn 1 hàng rất dễ dàng vì bạn có thể tạo ID bằng Python và thực hiện một yêu cầu cho mỗi hàng, nhưng vì chúng được lưu trữ, nên không sao.

Đã trả lời ngày 8 tháng 7 năm 2021 lúc 18:30Jul 8, 2021 at 18:30

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

DinidinizdinidinizDinidiniz

7419 Huy hiệu bạc15 Huy hiệu Đồng9 silver badges15 bronze badges

Nếu bạn chỉ có một yêu cầu đọc

Kết hợp câu trả lời của @Redsio với bảng tạm thời (600K không nhiều):

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
6

Và sau đó lấy một phiên bản của @Redsios Trả lời:

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
7

Nếu bảng lớn, bạn có thể rây trên phần đầu tiên:

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
8

Nếu bạn có nhiều yêu cầu đọc

  1. Phiên bản: Bạn có thể giữ bảng

    SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
    
    9 liên tục, hãy gọi nó là DataTable_idlist. Tái tạo bảng đó trong các khoảng thời gian nhất định (ngày, giờ), vì nó cũng sẽ nhận được lỗ hổng. Nếu bàn của bạn thực sự lớn, bạn cũng có thể nạp lại lỗ hổng

    chọn l.data_id như toàn bộ từ dataTable_idlist l tham gia dataTable dt trên dt.id = l.data_id trong đó dt.id là null;

  2. Phiên bản: Cung cấp cho bộ dữ liệu của bạn một cột ngẫu nhiên_sortorder trực tiếp trong DataTable hoặc trong một bảng bổ sung liên tục

    SELECT *
    FROM random, (
            SELECT id AS sid
            FROM random
            ORDER BY RAND( )
            LIMIT 10
        ) tmp
    WHERE random.id = tmp.sid;
    
    0. Chỉ mục cột đó. Tạo giá trị ngẫu nhiên trong ứng dụng của bạn (tôi sẽ gọi nó là
    SELECT *
    FROM random, (
            SELECT id AS sid
            FROM random
            ORDER BY RAND( )
            LIMIT 10
        ) tmp
    WHERE random.id = tmp.sid;
    
    1).

    SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
    
    9

Giải pháp này phân biệt 'các hàng cạnh' với mức cao nhất và thấp nhất_sortorder thấp nhất, do đó sắp xếp lại chúng trong các khoảng thời gian (mỗi ngày một lần).

Đã trả lời ngày 7 tháng 5 năm 2014 lúc 6:02May 7, 2014 at 6:02

Flaschenpostflaschenpostflaschenpost

2.1851 Huy hiệu vàng13 Huy hiệu bạc28 Huy hiệu đồng1 gold badge13 silver badges28 bronze badges

Một giải pháp đơn giản khác sẽ là xếp hạng các hàng và lấy một trong số chúng một cách ngẫu nhiên và với giải pháp này, bạn sẽ không cần phải có bất kỳ cột dựa trên 'ID' nào trong bảng.

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
0

Bạn có thể thay đổi giá trị giới hạn theo nhu cầu của bạn để truy cập bao nhiêu hàng tùy thích nhưng điều đó hầu như sẽ là các giá trị liên tiếp.

Tuy nhiên, nếu bạn không muốn các giá trị ngẫu nhiên liên tiếp thì bạn có thể lấy một mẫu lớn hơn và chọn ngẫu nhiên từ nó. cái gì đó như ...

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
1

Đã trả lời ngày 9 tháng 11 năm 2015 lúc 13:37Nov 9, 2015 at 13:37

sactiwsactiwsactiw

21.4K4 Huy hiệu vàng39 Huy hiệu bạc28 Huy hiệu đồng4 gold badges39 silver badges28 bronze badges

Một cách mà tôi thấy khá tốt nếu có ID tự phát là sử dụng toán tử modulo '%'. Ví dụ: nếu bạn cần 10.000 hồ sơ ngẫu nhiên ra 70.000, bạn có thể đơn giản hóa điều này bằng cách nói rằng bạn cần 1 trên mỗi 7 hàng. Điều này có thể được đơn giản hóa trong truy vấn này:

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
2

Nếu kết quả phân chia các hàng mục tiêu cho tổng khả dụng không phải là một số nguyên, bạn sẽ có thêm một số hàng so với những gì bạn yêu cầu, vì vậy bạn nên thêm một điều khoản giới hạn để giúp bạn cắt giảm kết quả như thế này:

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
3

Điều này đòi hỏi phải quét đầy đủ, nhưng nó nhanh hơn thứ tự của Rand, và theo tôi đơn giản hơn để hiểu hơn các tùy chọn khác được đề cập trong chủ đề này. Ngoài ra, nếu hệ thống ghi vào DB sẽ tạo các bộ hàng theo lô, bạn có thể không nhận được kết quả ngẫu nhiên như bạn mong đợi.

Đã trả lời ngày 22 tháng 6 năm 2016 lúc 13:22Jun 22, 2016 at 13:22

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

1

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
4

ID là khóa chính, được sắp xếp theo ID, giải thích TAGE_WITH_600K_ROWS, thấy rằng hàng không quét toàn bộ bảng

Đã trả lời ngày 2 tháng 8 năm 2021 lúc 8:30Aug 2, 2021 at 8:30

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

取 一 好 取 一 个 个 好 的 的 的 的取一个好的名字

1.51713 Huy hiệu bạc16 Huy hiệu đồng13 silver badges16 bronze badges

Tôi nghĩ rằng đây là một cách đơn giản và nhanh hơn, tôi đã thử nghiệm nó trên máy chủ trực tiếp so với một vài câu trả lời ở trên và nó nhanh hơn.

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
5

// đã lấy 0,0014 giây so với bảng 130 hàng

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
6

// đã lấy 0,0042 giây so với bảng 130 hàng

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
7

// đã mất 0,0040 giây so với bảng 130 hàng

Đã trả lời ngày 18 tháng 6 năm 2020 lúc 3:28Jun 18, 2020 at 3:28

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

GeniusgeekgeniusgeekGeniusGeek

2955 Huy hiệu bạc14 Huy hiệu Đồng5 silver badges14 bronze badges

Tôi sử dụng truy vấn này:

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
8

Thời gian truy vấn: 0,016s

Đã trả lời ngày 5 tháng 11 năm 2014 lúc 10:39Nov 5, 2014 at 10:39

1

Đây là cách tôi làm điều đó:

$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: $time segundos",1);
9

Tôi thích nó vì không yêu cầu các bảng khác, nó rất đơn giản để viết và rất nhanh để thực hiện.

Đã trả lời ngày 15 tháng 2 năm 2013 lúc 14:57Feb 15, 2013 at 14:57

Bernardo Siubernardo SiuBernardo Siu

1.36113 Huy hiệu bạc13 Huy hiệu đồng13 silver badges13 bronze badges

1

Sử dụng truy vấn đơn giản dưới đây để lấy dữ liệu ngẫu nhiên từ bảng.

$rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
$offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
$sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
$stmt = $pdo->prepare($sql);
$stmt->execute( $offset );
$rand_bug = $stmt->fetch();
0

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

Arun a s

5.9674 Huy hiệu vàng29 Huy hiệu bạc41 Huy hiệu đồng4 gold badges29 silver badges41 bronze badges

Đã trả lời ngày 24 tháng 2 năm 2015 lúc 6:12Feb 24, 2015 at 6:12

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

ManojmanojMANOJ

1615 Huy hiệu bạc13 Huy hiệu Đồng5 silver badges13 bronze badges

2

Tôi đoán đây là cách tốt nhất có thể ..

$rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
$offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
$sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
$stmt = $pdo->prepare($sql);
$stmt->execute( $offset );
$rand_bug = $stmt->fetch();
1

Đã trả lời ngày 4 tháng 4 năm 2013 lúc 16:15Apr 4, 2013 at 16:15

Hướng dẫn how do i randomly select data in mysql? - làm cách nào để chọn ngẫu nhiên dữ liệu trong mysql?

2