2012-02-16 173 views
1

我有一個數據庫可以跟蹤書籍。這些書表看起來像這樣:從數據庫中隨機選擇

----------------------------------------------- 
    BookID | UserID  |  SecID 
----------------------------------------------- 
    66  |  1   |  3 
----------------------------------------------- 
    67  |  1   |  2 
----------------------------------------------- 
    68  |  1   |  5 
----------------------------------------------- 
    69  |  2   |  2 
----------------------------------------------- 

我想選擇由特定用戶從可能的部分

例如 陣列擁有的隨機書,如果$userID = 1$arrayA = array(1,2,3);輸出應該是本書6667

我可以只使用array_rand($arrayA, 1);然後注入任何隨機數的函數返回與此SQL語句來拉書

SELECT * FROM `books` WHERE userID = '1' AND typeID = '$randomSection' LIMIT 1 

但是,如果array_rand函數返回1,則sq​​l語句不返回任何內容。如何編寫一個更好的sql語句來保證結果,只要用戶至少有一本書在給定章節中列出了一本書?

回答

2
SELECT * 
    FROM `books` 
    WHERE userID = 1 
    AND typeID IN (1, 2, 3) 
ORDER BY RAND() 
    LIMIT 1 

ORDER BY RAND()是相當昂貴的,如果你有很多符合條件的結果,反而是無關緊要的小結果集,並以最簡單的方式做到這一點。

+0

確實,這是肯定的正確答案。你碰巧知道一個更便宜的方法來實現相同的目標。理論上? – 2012-02-16 07:01:57

+0

這可能取決於您的特定數據集。請搜索這個網站,你會發現很多答案。 – deceze 2012-02-16 07:18:08

2

只需在查詢了些許變化:

SELECT * FROM 'books' WHERE userID = '1' order by rand() LIMIT 1 
1

試試這個:

select * from t1 
where userid = '1' and secid in ('1', '2', '3') 
order by rand() 
limit 1 

當然,1(1, 2, 3)將參數那裏。

+0

不幸的是,只有一個答案可以接受。儘管我排列你的答案!謝謝 – 2012-02-16 07:02:50