【发布时间】:2020-08-16 20:52:06
【问题描述】:
目标:为每一行显示多个标签(就像下面的stackoverflow示例)
详细信息:每一行都是来自表“news”的查询结果(下面的查询 1)。然后,我从表“tags”(下面的查询 2)中调用第二个查询。
查询:
-
选择新闻的查询:
SELECT * FROM news -
查询标签 - 在 PHP foreach statemnt中:
SELECT DISTINCT t.* FROM tags INNER JOIN joiner j ON j.news_id = t.tag_id INNER JOIN news n ON n.news_id = j.news_id WHERE n.news_id = XXXXXXX
XXXXXX 是当前在 PHP 中循环的新闻 ID,这就是问题所在
问题:
如果我显示 10 条新闻 文章,这将导致 1 次查询 来获取新闻,10 次查询 来获取标签。有没有更好的方法来处理每页显示 200 条新闻?
对于 CodeIgniter 用户,是否可以在 DB builder 中使用简化的方法?
注意:如果需要进一步阐述,请发表评论。
【问题讨论】:
-
您可以先获取所有
news_ids,然后在标签查询中执行WHERE n.news_id = XX OR n.news_id = XY OR n.news_id = YY,而不是每个标签触发一次查询 -
您可以使用
WHERE n.news_id IN (X, Y, Z, ...)。同样在您的第二个查询中,您仅在WHERE部分的新闻表中使用news_id。但是news.news_id与joiner.news_id相同,因此您可以使用WHERE j.news_id IN (X, Y, Z, ...)避免额外的连接。 -
@mulquin 我假设您的意思是每个“新闻”而不是“标签”?
-
您必须将
j.news_id添加到第二个查询的SELECT部分。您将在第二个查询中为您的第一个查询选择的所有新闻加载标签。然后您将使用一些循环将第二个查询的结果与他们的新闻相匹配。 -
顺便说一句,我不知道codeigniter,但它没有实现某种具有关系支持的活动记录设计模式吗?在我通常使用的 Yii 框架中,所有这些都是通过简单地告诉框架为该关系使用预加载来完成的。
标签: php mysql codeigniter tags subquery