执行搜索...一个大型查询或中型和多个小型查询?

时间:2011-08-23 13:03:18

标签: php mysql

现在,以下查询为每个结果返回1行....我需要显示每行的标记列表,我正在讨论是否要更改此查询,以便INNER加入标记并解析数据在PHP端,或者我应该为每个返回结果运行一个单独的查询....你对此有何看法?我应该提取额外的数据并在PHP端解析它还是运行其他查询(可能是25-30)?

            SELECT
                content.id,
                content_text.content
            FROM content
            INNER JOIN content_text ON (
                content_text.content_id = content.id AND
                content_text.language_id = 1
            )
            INNER JOIN tags_to_content ON (
                tags_to_content.tag_id IN (1)
            )

2 个答案:

答案 0 :(得分:1)

你可以依赖一个在mysql中使用不多的小命令:GROUP_CONCAT()

Official Doc for GROUP_CONCAT

这是一个小例子(不是基于你当前的问题,因为我不知道具体细节,它是一个可以应用于博客的例子):

SELECT
  p.title as title,
  p.content as content,
  GROUP_CONCAT(c.name order by c.name SEPARATOR ', ') as categories
FROM
  post as p
INNER JOIN
  post_category as pc
ON
  p.id = pc.post_id
INNER JOIN
  category as c
ON
  pc.category_id = c.id
GROUP BY
  p.id

哪会返回

+------------------+--------------------+------------------------------------+
| title            | content            | categories                         |
+------------------+--------------------+------------------------------------+
| Some title       | Some content       | category 1, category 2, category 3 |
| Some other title | Some other content | category 1, category 3, category 4 |
...
+------------------+--------------------+------------------------------------+

答案 1 :(得分:0)

我总是将循环的结果数与总行数和连接表中的记录数进行权衡。

假设您的表“学生”中有1000条记录,并且所有学生都属于3个类别(categorie_id左侧加入类别...),我将循环学生并获取(+缓存)连接表(类别)。

如果您有1000名学生,1500名父母(来自表父母的parent_id),以及您的查询结果(例如“这个城市以外的学生”)返回所有学生,我会去联合表。如果您只希望返回10%的学生(例如“城外学生”),我会再次进行小型查询(如第一个例子)。

如果有疑问,请运行一个示例查询并在其上放置一个计时器......?