目前,对于我的网站,我的文章上都有标记。
当我遍历文章列表时,对于每一篇文章,我都会执行一个mysql查询来为它们收集类别标记列表,如下所示:
import json
my_dct = json.loads(json_string)
现在,想象一下我一次显示30篇文章的页面,上面的查询将完成30次。我想这太糟糕了。
我决定做的是在页面上创建所有article_ids的数组,然后执行此操作:
SELECT c.`category_name`, c.`category_id`
FROM `articles_categorys` c
INNER JOIN `article_category_reference` r ON c.category_id = r.category_id
WHERE r.article_id = 8136
ORDER BY r.`category_id` = *IDHERE* DESC, r.`category_id` ASC
LIMIT 4
然后我使用PHP来循环遍历从上面找到的数组,将article_id与当前文章匹配,如果匹配echo的category_name。唯一的问题是现在我无法将其限制为每篇文章4个。
新方法是更好,更糟,还是两者都糟透了?
要使用的示例数据:
SELECT c.`category_name`, c.`category_id`, r.article_id
FROM `articles_categorys` c
INNER JOIN `article_category_reference` r ON c.category_id = r.category_id
WHERE r.article_id = 8136 OR r.article_id = 8130 OR r.article_id = 8127
OR r.article_id = 8125 OR r.article_id = 8123 OR r.article_id = 8120
OR r.article_id = 8119 OR r.article_id = 8117 OR r.article_id = 8116
OR r.article_id = 8112 OR r.article_id = 8107 OR r.article_id = 8106
OR r.article_id = 8037 OR r.article_id = 8104 OR r.article_id = 8103
答案 0 :(得分:1)
使用SQL,对您的查询进行基准测试并对其进行探索以查看哪个更快会更好。但根据经验,IN可能会胜过多个OR。这仍然会让您将结果限制为四个。与评论中所说的相反,获取所有数据然后使用PHP仅选择4个项目并不是一个好主意。您可能只检索数千行以显示一百行。
SET @rank=null, @val=null;
SELECT * FROM (
SELECT c.`category_name`, c.`category_id`, r.article_id,
@rank := IF(@val = r.article_id, @rank+1,1) as rank,
@val := r.article_id
FROM `articles_categorys` c
INNER JOIN `article_category_reference` r ON c.category_id = r.category_id
WHERE r.article_id IN (8136, /* fill this up accordingly */)
ORDER BY r.`category_id` ASC
) AS a WHERE rank < 5;
有关详情,请参阅此优秀问答:Using LIMIT within GROUP BY to get N results per group?
简而言之,此查询的作用是为每条记录设置排名。在开始时,rank为null,对于第一行,它将被设置为null。虽然r.category_id保持不变,但它会继续增加,但当category_id发生变化时会回落到一个。
答案 1 :(得分:0)
有时候不足以做出好的查询,你必须使用SQL选项。 为了使您的查询更快,您应该使用索引(例如hash或btree)或唯一值https://www.tutorialspoint.com/mysql/mysql-indexes.htm。