现在,以下查询为每个结果返回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)
)
答案 0 :(得分:1)
你可以依赖一个在mysql中使用不多的小命令: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%的学生(例如“城外学生”),我会再次进行小型查询(如第一个例子)。
如果有疑问,请运行一个示例查询并在其上放置一个计时器......?