Php 获取基于类别的随机条目
我有一张叫做“文章”的桌子。此表的结构如下:id(唯一)、类别(文章的类别,即娱乐)、标题(文章的标题)、图像(文章的图像URL)、链接(文章的URL)、计数器(文章的浏览次数)、日期戳(文章发表的日期) 假设我想打印6篇随机娱乐文章。简单但效率较低的方法是这样做Php 获取基于类别的随机条目,php,mysql,mysqli,Php,Mysql,Mysqli,我有一张叫做“文章”的桌子。此表的结构如下:id(唯一)、类别(文章的类别,即娱乐)、标题(文章的标题)、图像(文章的图像URL)、链接(文章的URL)、计数器(文章的浏览次数)、日期戳(文章发表的日期) 假设我想打印6篇随机娱乐文章。简单但效率较低的方法是这样做 $result = $db->query("SELECT * FROM Articles WHERE category = 'entertainment' ORDER BY RAND() LIMIT 6); 相反,我该如何更有
$result = $db->query("SELECT * FROM Articles WHERE category = 'entertainment' ORDER BY RAND() LIMIT 6);
相反,我该如何更有效地进行?我知道有多个网站解释ORDER BY RAND()的替代方案,但我不理解这些替代方案。我想根据我的结构来理解。我尝试过多种方法,从洗牌关联数组到创建随机生成器,但都以失败告终,因为我无法让它正常工作。如何在不使用ORDER BY RAND()的情况下打印出6篇随机娱乐文章?没有通用的方法,有效的方法之一是根据给定的(可选)标准选择随机数据子集,在您的情况下,
类别
。请注意此列上添加的索引
SELECT
r1.*
FROM
articles AS r1
INNER JOIN (SELECT(RAND() * (SELECT MAX(id) FROM articles)) AS id) AS r2
WHERE
r1.id >= r2.id
AND r1.category = 'entertainment'
LIMIT 6;
以下是示例数据(320万行)和执行计划的详细信息:
mysql> SELECT COUNT(*) FROM articles;
+----------+
| COUNT(*) |
+----------+
| 3200000 |
+----------+
1 row in set (0.00 sec)
希望这对您有所帮助。您的表大吗(比如说1000多个条目)?如果没有,您可以选择所有数据,并使用PHP在结果中获得一个随机行…@random它现在不大,但将来会变大,所以我现在需要一个解决方案,所以我不必回去修复它。谢谢您的回答!我有一个问题,当你说选择r1时,r1是什么。*?另外,我有7个娱乐项目。我想6随机娱乐文章被准确显示,这个查询有时显示4,5等数字1-6。如果我想准确显示6篇文章,我会怎么做?
mysql> SELECT
r1.*
FROM
articles AS r1
INNER JOIN (SELECT(RAND() * (SELECT MAX(id) FROM articles)) AS id) AS r2
WHERE
r1.id >= r2.id
AND r1.category = 'entertainment'
LIMIT 6;
+---------+-------------+-----------------------------------------------------------+---------------+
| id | topic | message | category |
+---------+-------------+-----------------------------------------------------------+---------------+
| 3153910 | JAX68VVH3FZ | Sed eu eros. Nam consequat dolor | entertainment |
| 3153911 | NIY23HWV0VM | tortor. Nunc commodo auctor velit. Aliquam nisl. Nulla eu | entertainment |
| 3153912 | LKQ42FRB7LA | mus. Proin vel nisl. Quisque | entertainment |
| 3153913 | PFL39VHI9RM | gravida | entertainment |
| 3153914 | FGV59TUN9TQ | elit, pellentesque a, facilisis non, bibendum sed, | entertainment |
| 3153915 | OWH73EBZ1GW | ligula. Nullam enim. Sed nulla ante, iaculis | entertainment |
+---------+-------------+-----------------------------------------------------------+---------------+
6 rows in set (0.473 sec)
mysql> explain extended
SELECT
r1.*
FROM
articles AS r1
INNER JOIN (SELECT(RAND() * (SELECT MAX(id) FROM articles)) AS id) AS r2
WHERE
r1.id >= r2.id
AND r1.category = 'entertainment'
LIMIT 6;
+----+-------------+------------+--------+-----------------+---------+---------+-------+---------+----------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+--------+-----------------+---------+---------+-------+---------+----------+------------------------------+
| 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | 100 | NULL |
| 1 | PRIMARY | r1 | ref | PRIMARY,cat_IDX | cat_IDX | 768 | const | 1560229 | 100 | Using index condition |
| 2 | DERIVED | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used |
| 3 | SUBQUERY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
+----+-------------+------------+--------+-----------------+---------+---------+-------+---------+----------+------------------------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM articles WHERE category = 'entertainment' ORDER BY RAND() LIMIT 6;
+---------+-------------+---------------------------------------------------------------------------+---------------+
| id | topic | message | category |
+---------+-------------+---------------------------------------------------------------------------+---------------+
| 2374491 | PZC33VGM0ML | Duis cursus, diam at pretium aliquet, metus urna convallis erat, | entertainment |
| 382306 | RFN88EPE4MI | malesuada fames ac turpis egestas. Aliquam fringilla cursus purus. Nullam | entertainment |
| 1867986 | KWX30ULB1FR | pede. | entertainment |
| 1528863 | ADX52RRJ3MQ | lacus. Mauris non | entertainment |
| 2188208 | AOD82PXQ6FS | diam luctus lobortis. Class aptent taciti sociosqu ad litora | entertainment |
| 878426 | ABV08HTB2PG | eu eros. Nam consequat dolor vitae dolor. Donec fringilla. Donec | entertainment |
+---------+-------------+---------------------------------------------------------------------------+---------------+
6 rows in set (5.726 sec)