RAND() और PREPARE के साथ डायनामिक यादृच्छिक पंक्ति चयन
MySQL में ORDER BY RAND() LIMIT 1 सरल तरीका है, लेकिन बड़े टेबल पर धीमा होता है। PREPARE स्टेटमेंट के साथ डायनामिक क्वेरी बनाकर यादृच्छिक पंक्ति प्राप्त करना एक विकल्प है।
टेबल और डेटा
mysql> CREATE TABLE DemoTable(
FirstName VARCHAR(100),
CountryName VARCHAR(100)
);
Query OK, 0 rows affected (0.53 sec)
mysql> INSERT INTO DemoTable VALUES('Adam','US');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable VALUES('Chris','AUS');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable VALUES('Robert','UK');
Query OK, 1 row affected (0.32 sec)
सभी रिकॉर्ड
mysql> SELECT * FROM DemoTable;
+-----------+-------------+ | FirstName | CountryName | +-----------+-------------+ | Adam | US | | Chris | AUS | | Robert | UK | +-----------+-------------+ 3 rows in set (0.00 sec)
यादृच्छिक पंक्ति प्राप्त करने की प्रक्रिया
mysql> SET @value := ROUND((SELECT COUNT(*) FROM DemoTable) * RAND());
Query OK, 0 rows affected (0.00 sec)
mysql> SET @query := CONCAT('SELECT * FROM DemoTable LIMIT ', @value, ', 1');
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE myStatement FROM @query;
Query OK, 0 rows affected (0.00 sec) Statement prepared
mysql> EXECUTE myStatement;
+-----------+-------------+
| FirstName | CountryName |
+-----------+-------------+
| Chris | AUS |
+-----------+-------------+
1 row in set (0.00 sec)
mysql> DEALLOCATE PREPARE myStatement;
Query OK, 0 rows affected (0.00 sec)
व्याख्या: COUNT(*) * RAND() 0 से (कुल-1) के बीच यादृच्छिक ऑफसेट देता है। PREPARE डायनामिक SQL तैयार करता है। यह तरीका ORDER BY RAND() से बड़े टेबल पर तेज़ हो सकता है।
सरल विकल्प: SELECT * FROM DemoTable ORDER BY RAND() LIMIT 1; छोटे टेबल के लिए पर्याप्त है।