0

我有一个查询

SELECT SQL_CALC_FOUND_ROWS a.memberid, a.category_id, a.content, a.count_cid, a.importance
FROM tb_profilingdata a, tb_member b
WHERE a.memberid = b.memberid AND a.category_id IN ($catstr)  AND a.memberid NOT IN ( $seen_txt) AND b.gender != '$gender'
ORDER BY a.memberid, a.category_id LIMIT $offset, 4500

由于我的表非常大,我想将我的查询结果限制在一定范围内。还可以选择一个动态偏移量,这样我每次运行查询时都可以获得一组随机值。

到目前为止,我正在通过 PHP 根据表中的总行数计算随机偏移量。但是如果偏移值大于查询返回的总行数,则结果将为空。

那么有什么方法可以让我不必加载整个表并设置适当的随机偏移量以便我可以获得随机值?

4

2 回答 2

0

试试这个嵌套查询:

SELECT c.* FROM (
    SELECT a.memberid, a.category_id, a.content, a.count_cid, a.importance
    FROM tb_profilingdata a, tb_member b
    WHERE a.memberid = b.memberid AND a.category_id IN ($catstr) AND a.memberid NOT IN ($seen_txt) AND b.gender != '$gender'
    ORDER BY RAND() LIMIT 4500
) c ORDER BY c.memberid, c.category_id

注意:您将无法使用 SQL_CALC_FOUND_ROWS 获取表中的总行数。

有几种方法可以优化 ORDER BY RAND()

于 2013-02-02T06:02:03.610 回答
0

使用 Turnery 运算符从 url 获取偏移量,如下所示 (isset($_REQUEST['offset']))?$offset=$_REQUEST['offset']:$offset=0;

对于随机偏移使用 rand 函数 $offset=rand(0,totalrecord/4500);

并在您的查询中传递此偏移量

SELECT SQL_CALC_FOUND_ROWS a.memberid, a.category_id, a.content, a.count_cid, a.importance FROM tb_profilingdata a, tb_member b WHERE a.memberid = b.memberid AND a.category_id IN ($catstr) AND a.memberid NOT IN ($seen_txt) AND b.gender != '$gender' ORDER BY a.memberid, a.category_id LIMIT $offset, 4500

于 2013-02-02T06:20:16.160 回答