【问题标题】:Reducing the number of queries when selecting multiple tables减少选择多个表时的查询次数
【发布时间】:2020-08-16 20:52:06
【问题描述】:

目标:为每一行显示多个标签(就像下面的stackoverflow示例)

详细信息:每一行都是来自表“news”的查询结果(下面的查询 1)。然后,我从表“tags”(下面的查询 2)中调用第二个查询。

查询:

  1. 选择新闻的查询:

    SELECT * FROM news

  2. 查询标签 - 在 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,这就是问题所在

问题:

  1. 如果我显示 10 条新闻 文章,这将导致 1 次查询 来获取新闻,10 次查询 来获取标签。有没有更好的方法来处理每页显示 200 条新闻?

  2. 对于 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


【解决方案1】:

这是一个查询示例...

SELECT c.olumns
     , y.ou
     , a.ctually
     , w.ant
  FROM news c
  JOIN joiner y
    ON y.news_id = c.news_id
  JOIN tags a
    ON a.tag_id = y.tag_id

免责声明:我不是程序员

【讨论】:

  • 这个查询的问题是,它将多次选择相同的新闻(对于每个分配的标签)。
  • 这不是问题。这似乎是你想要的!
  • 其实是个问题。你为什么要把同一个新闻循环两次?另一方面,标签可以是多个。
猜你喜欢
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多