Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में RAND() और LIMIT 1 का उपयोग करके रैंडम पंक्ति चुनना

MySQL में टेबल से एक रैंडम पंक्ति प्राप्त करने के लिए ORDER BY RAND() के साथ LIMIT 1 का उपयोग करें। यह नमूना लेने, A/B टेस्टिंग, या फीचर्ड सामग्री दिखाने के लिए उपयोगी है।

सिंटैक्स

SELECT * FROM table_name ORDER BY RAND() LIMIT 1;

व्यावहारिक उदाहरण

1. टेबल बनाएं और डेटा डालें

mysql> CREATE TABLE DemoTable735 (Amount INT);
Query OK, 0 rows affected (0.57 sec)

mysql> INSERT INTO DemoTable735 VALUES 
(984474734), (489393323), (23432333), (8949933);
Query OK, 4 rows affected (0.15 sec)

2. सभी रिकॉर्ड्स देखें

mysql> SELECT * FROM DemoTable735;
+-----------+
| Amount    |
+-----------+
| 984474734 |
| 489393323 |
| 23432333  |
| 8949933   |
+-----------+
4 rows in set (0.00 sec)

3. रैंडम पंक्ति चुनें

mysql> SELECT * FROM DemoTable735 ORDER BY RAND() LIMIT 1;
+-----------+
| Amount    |
+-----------+
| 489393323 |  -- हर बार अलग परिणाम संभव
+-----------+
1 row in set (0.00 sec)

प्रदर्शन चेतावनी ⚠️

ORDER BY RAND() बड़े टेबल्स पर बहुत धीमा है!

  • पूरी टेबल पढ़ता है, प्रत्येक पंक्ति के लिए रैंडम मान उत्पन्न करता है, क्रमबद्ध करता है
  • 10,000+ पंक्तियों पर ध्यान देने योग्य विलंब
  • 1,000,000+ पंक्तियों पर बहुत धीमा

बड़े टेबल्स के लिए कुशल विकल्प

विधि 1: MAX(ID) पर रैंडम ऑफसेट (यदि ID क्रमिक है)

SELECT * FROM table_name 
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM table_name)))
ORDER BY id LIMIT 1;

विधि 2: दो क्वेरीज़ (एप्लिकेशन लेयर पर)

-- 1. गिनती प्राप्त करें
SELECT COUNT(*) FROM table_name;  -- मान लें 10000

-- 2. एप्लिकेशन में रैंडम ऑफसेट जनरेट करें (0-9999)
-- 3. ऑफसेट के साथ क्वेरी
SELECT * FROM table_name LIMIT 1 OFFSET 4321;

विधि 3: रैंडम कॉलम जोड़ें (लिखने पर जनरेट)

ALTER TABLE table_name ADD COLUMN rand_val DOUBLE AS (RAND()) STORED;
ALTER TABLE table_name ADD INDEX idx_rand (rand_val);

-- फिर तेज़ क्वेरी
SELECT * FROM table_name ORDER BY rand_val LIMIT 1;

विधि 4: TABLESAMPLE (MySQL 8.0.23+ - केवल InnoDB)

SELECT * FROM table_name TABLESAMPLE SYSTEM (1) LIMIT 1;

एकाधिक रैंडम पंक्तियाँ

-- 5 रैंडम पंक्तियाँ
SELECT * FROM table_name ORDER BY RAND() LIMIT 5;

भारित रैंडम चयन

-- वजन कॉलम के आधार पर
SELECT * FROM table_name 
ORDER BY RAND() * weight_column DESC LIMIT 1;

सारांश

टेबल आकारअनुशंसित विधि
< 1,000 पंक्तियाँORDER BY RAND() LIMIT 1 ठीक है
1,000 - 100,000रैंडम ऑफसेट या रैंडम कॉलम
> 100,000रैंडम कॉलम + इंडेक्स या TABLESAMPLE
  1. - MySQL में एकाधिक घटनाओं वाले नाम के लिए रैंडम पंक्ति (Id और Name) कैसे चुनें?

    MySQL: डुप्लिकेट नाम वाले रिकॉर्ड से रैंडम पंक्ति चुनना जब किसी नाम की कई पंक्तियां हों और उनमें से एक रैंडम पंक्ति चाहिए, तो WHERE Name = value के साथ ORDER BY RAND() LIMIT 1 का उपयोग करें। उदाहरण: Bob नाम की रैंडम पंक्ति टेबल बनाएं: CREATE TABLE DemoTable ( Id INT NOT NULL AUTO_INCREMENT PRIM

  1. - MySQL में WHERE क्लॉज में तिथि घटाकर ROW कैसे चुनें?

    TIMESTAMPDIFF() फ़ंक्शन दो तिथियों के बीच अंतर (मिनट, घंटे, दिन आदि) निकालने के लिए: TIMESTAMPDIFF(UNIT, start_datetime, end_datetime) उदाहरण insert into demo42 values(2020-01-10 12:30:05), (2019-02-24 10:40:45), (2020-05-12 05:45:55), (2020-05-12 05:40:55), (2020-05-12 05:42:55); 5 मिनट के अंदर

  1. - MySQL में अगली पंक्ति पेजिनेशन कैसे चुनें?

    LIMIT क्लॉज LIMIT offset, row_count से पेजिनेशन लागू करें। उदाहरण insert into demo40(name) values(Chris), (David), (Mike), (Sam), (Carol), (bob); 5वीं और 6वीं पंक्ति प्राप्त करना (offset=4, count=2) select * from demo40 limit 4,2; +----+-------+ | id | name | +----+-------+ | 5 | Carol | | 6