Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多层MySQL查询?_Php_Mysql_Codeigniter - Fatal编程技术网

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)返回的不仅仅是一个值,所以这真的是我最好的方法,还是我当前的方法是实现这一点的理想方法?这似乎是解决我实际问题的一个办法……如果您当前的方式(这是最好的方式)给您带来了速度问题,请尝试缓存标记查询输出(它们不会频繁更改),如果存储标记的最后编辑日期,您可以重设缓存。