2012-02-16 133 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