Php 多层MySQL查询?
我有两个带有多对多链接表的表(条目和标记)。现在,我正在进行一个查询,以检索符合我的条件的所有条目,并对每个条目进行一个查询,以检索标记Php 多层MySQL查询?,php,mysql,codeigniter,Php,Mysql,Codeigniter,我有两个带有多对多链接表的表(条目和标记)。现在,我正在进行一个查询,以检索符合我的条件的所有条目,并对每个条目进行一个查询,以检索标记 有没有一种方法可以说,在第一次查询中,通过一个新列将标记作为数组返回?您可以使用GROUP BY和GROUP_CONCAT函数一次将所有标记作为串联字符串获取 此查询: SELECT e.id entry_id , GROUP_CONCAT(t.txt ORDER BY t.
有没有一种方法可以说,在第一次查询中,通过一个新列将标记作为数组返回?您可以使用
GROUP BY
和GROUP_CONCAT
函数一次将所有标记作为串联字符串获取 此查询:
SELECT e.id entry_id
, GROUP_CONCAT(t.txt ORDER BY t.txt) tags
FROM entry e
LEFT JOIN entry_tag et
ON e.id = et.entry_id
LEFT JOIN tag t
ON et.tag_id = t.id
GROUP BY e.id
将以逗号分隔的列表形式返回标记。您可以阅读GROUP_CONCAT了解更多选项:
在你的应用程序中,你应该能够很容易地将其扩展成一个数组。例如,在php中,可以使用explode
:
如果您需要标记
或条目_标记
表中的更多属性,您可以添加更多的组_-CONCAT
列,或者为您的数据考虑一些序列化格式(如JSON),并在此基础上使用组_-CONCAT
,或者,您可以简单地为每个条目返回多行,并在应用程序中处理结果,以将标记与条目保持在一起:
$sql = '
SELECT e.id entry_id
, t.id tag_id
, t.txt tag_text
, t.published tag_published
FROM entry e
LEFT JOIN entry_tag et
ON e.id = et.entry_id
LEFT JOIN tag t
ON et.tag_id = t.id
ORDER BY e.id
';
$result = mysql_query($ql);
$entry_id = NULL;
$entry_rows = NULL;
while ($row = mysql_fetch_assoc($result)) {
if ($entry_id != $row['entry_id']) {
if (isset($entry_id)) { //ok, found new entry
process_entry($entry_rows); //process the rows collected so far
}
$entry_id = $row['entry_id'];
$entry_rows = array();
}
$entry_rows[] = $row; //store row for his entry for later processing
}
if (isset($entry_id)){ //process the batch of rows for the last entry
process_entry($entry_rows);
}
请注意,group_concat有一个限制,您必须
设置group_concat_max_len=2048代码>以确保组_CONCAT容纳大量字段。@Pentium10:这是一种方法。另一种方法是在my.cnf中指定它。不过,您的2048码似乎是随意的。就我个人而言,如果你真的想确定的话,我建议将它设置为@max\u allowed\u packet。我们有很多标记,这个2048运行得很好。谢谢分享这个变量。所以没有办法让它们真正多维化?这似乎是一个可行的解决方案,但我实际上希望从每个标记(如id、name、published)返回的不仅仅是一个值,所以这真的是我最好的方法,还是我当前的方法是实现这一点的理想方法?这似乎是解决我实际问题的一个办法……如果您当前的方式(这是最好的方式)给您带来了速度问题,请尝试缓存标记查询输出(它们不会频繁更改),如果存储标记的最后编辑日期,您可以重设缓存。