Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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 查询具有一对多关系的两个表_Php_Mysql_Join_One To Many - Fatal编程技术网

Php 查询具有一对多关系的两个表

Php 查询具有一对多关系的两个表,php,mysql,join,one-to-many,Php,Mysql,Join,One To Many,我觉得有点尴尬,因为可能有一个简单的解决方案,但我不知道足够的MySQL来做这件事。如何使用一个查询从每个表中获取数据,然后返回如下所示的数组?我每次尝试都会返回一个标记,或者返回同一任务的多个数组,每个数组都有不同的标记 我的查询结构应该是什么样的 谢谢 图像的数组实际上显示了两次而不是一次查询后数据的外观。为了能够在单个查询中完成此操作,这是因为数据并不太复杂,您可以使用GROUP\u CONCAT()获取任务的所有标记,然后使用查询后逻辑将数据拆分为单独的数组 获取所有请求数据的SQL查询

我觉得有点尴尬,因为可能有一个简单的解决方案,但我不知道足够的MySQL来做这件事。如何使用一个查询从每个表中获取数据,然后返回如下所示的数组?我每次尝试都会返回一个标记,或者返回同一任务的多个数组,每个数组都有不同的标记

我的查询结构应该是什么样的

谢谢


图像的数组实际上显示了两次而不是一次查询后数据的外观。为了能够在单个查询中完成此操作,这是因为数据并不太复杂,您可以使用
GROUP\u CONCAT()
获取任务的所有标记,然后使用查询后逻辑将数据拆分为单独的数组

获取所有请求数据的SQL查询为:

SELECT
    tasks.*, GROUP_CONCAT(tag_name) AS tags
FROM
    tasks LEFT JOIN tags ON tags.task_id=tags.id
WHERE
    id=2
此查询将返回单个记录;在该记录中,
tags
列将包含一个逗号分隔的列表,其中列出了属于该任务的所有标记。可以将该列中的数据拆分为数组,以构建所需的结构

例如,使用PHP:

$result = mysql_query("SELECT tasks.*, GROUP_CONCAT(tag_name) AS tags FROM tasks LEFT JOIN tags ON tags.task_id=tags.id WHERE id=2");

// create the "$task" array that has a "task" and "tags" index
$task = array('task' => array(), 'tags' => array());
$task['task'] = mysql_fetch_assoc($result);

// split the comma-separated list of tags into an array
$task['tags'] = explode(',', $task['task']['tags']);

// delete the original "tags" entry that's returned by the sql query
unset($task['task']['tags']);

请注意,此示例没有任何数据验证、连接信息或其他逻辑,应仅作为如何将数据拆分为所需结构的粗略想法使用。

将“标记”作为“任务”(即$result['task']['tags'])中的子数组是否更有意义?这样,如果将来某个时候你想同时检索多个任务,那么它们的每个标记都包含在每个“任务”元素中,而不必把事情排成一行。是的,我也这么认为。基本上,我只想将标记信息与任务连接起来,这样当我显示任务列表而不是一个任务列表时,我就不必循环单独的查询来获取每个任务的标记。你知道这个查询会是什么样子吗?NewFurniture的解决方案很好,但如果可能的话,我希望避免使用爆炸线。要以您想要的方式获取数据,您只有三种直接选择(我看到了)。1) 执行两个单独的查询(一个用于任务,一个用于标记)。2) 使用
左联接执行一个查询,但不执行
组CONCAT()
-结果将是一个2D数组,除
标记名称外,每列中都有重复数据
;您需要在整个数组中循环并存储各个标记。3) 使用
组CONCAT()
分解()
。如果我可以问一下,为什么爆炸是一个问题?
GROUP_CONCAT
可能是您的最佳选择,前提是所有标记名都不能包含逗号(
)。这可以通过使用
分隔符来克服,例如
GROUP_CONCAT(tag_name SEPARATOR'|')
来生成管道字符,分隔符而不是逗号。