2009-08-10 32 views
56

Trong MySQL, tôi có thể sử dụng hàm RAND(), có cách nào khác trong SQLite 3 không?SQLite - ORDER BY RAND()

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/2171578/seeding-sqlite-random –

Trả lời

43

sử dụng random():

SELECT foo FROM bar 
    WHERE id >= (abs(random()) % (SELECT max(id) FROM bar)) 
    LIMIT 1; 

EDIT (bởi QoP): Từ các tài liệu trên SQLite Autoincrement cột ed khẳng định rằng:

Các thuật toán lựa chọn bình thường ROWID mô tả ở trên sẽ tạo đơn điệu tăng ROWIDs độc đáo miễn là bạn không bao giờ sử dụng giá trị ROWID tối đa và bạn không bao giờ xóa các entry trong bảng với các ROWID lớn nhất. Nếu bạn từng xóa hàng, thì ROWID từ hàng đã xóa trước đây có thể được sử dụng lại khi tạo hàng mới.

Ở trên chỉ đúng nếu bạn không có cột INTEGER PRIMARY KEY AUTOINCREMENT (nó vẫn hoạt động tốt với các cột INTEGER PRIMARY KEY). Dù sao, điều này nên được nhiều di động/đáng tin cậy:

SELECT foo FROM bar 
    WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar)) 
LIMIT 1; 

ROWID, _ROWID_OID đều bí danh cho SQLite id hàng nội bộ.

+2

+1 , Đây là cách nhanh hơn so với các tùy chọn khác với điều kiện id là chỉ mục. –

+14

Có giải pháp này nhanh hơn, nhưng giả định id bắt đầu từ 1 và không có khoảng trống. Nếu không, các hàng theo sau khoảng cách "ngẫu nhiên" được chọn thường xuyên hơn các hàng khác. –

+2

@Bill, cảm ơn vì đã chỉ ra vấn đề trên câu trả lời của tôi – dfa

33

quyết:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1; 
+8

Tôi không đồng ý. Hiện tại chúng tôi có hai bit thông tin, cách chọn ngẫu nhiên một bản ghi, cách liệt kê tất cả các bản ghi một cách ngẫu nhiên. Tôi chưa bao giờ cần phải làm một trong hai, nhưng nếu tôi làm, bây giờ tôi biết làm thế nào. Tôi cũng biết rằng MySQL thực hiện nó khác với SQLlite. Một câu hỏi siêu kỹ thuật sẽ ấn tượng hơn, nhưng ít hữu ích hơn. –

+0

Suy nghĩ đầu tiên của tôi là không có bất kỳ chức năng nào để sắp xếp các kết quả một cách ngẫu nhiên, hoặc nếu có một tính năng/chức năng như vậy thì sẽ càng mơ hồ hơn - đó là điều xảy ra với trình kích hoạt SQLite chẳng hạn. –

+4

Tôi đã bỏ phiếu này vì anh ấy đã trả lời trước. –

112
SELECT * FROM table ORDER BY RANDOM() LIMIT 1; 
+2

Và đối với hồ sơ giới hạn không phải là 1 nếu bạn muốn đặt hàng toàn bộ bảng ngẫu nhiên và truy cập tất cả các hàng theo thứ tự ngẫu nhiên đó. – lemontwist

+1

Điều này cũng sẽ hoạt động nếu bạn có một mệnh đề WHERE phức tạp và muốn một hàng ngẫu nhiên từ danh sách được lọc đó. Câu trả lời được chấp nhận không hỗ trợ dễ dàng. –

+0

Và One Khác không có hàng trùng lặp được trả về trong Kết quả, Đây là những gì tôi cần (y) –

9

Đối với việc sử dụng hiệu suất tốt hơn này trong SQLite:

SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x) 

này cũng được áp dụng cho MySQL. Điều này chạy nhanh hơn vì các công cụ SQL tải các trường hàng đầu tiên vào bộ nhớ rồi sắp xếp chúng, ở đây chúng tôi chỉ tải và sắp xếp ngẫu nhiên trường id của hàng, sau đó chúng tôi nhận được X của chúng và tìm toàn bộ các hàng của các id X này theo mặc định được lập chỉ mục.

Các vấn đề liên quan