我觉得有点尴尬,因为可能有一个简单的解决方案,但我不知道足够多的 MySQL 来做到这一点。如何使用一个查询从每个表中获取数据,然后返回一个数组,如下图所示?我所做的每一次尝试最终都会返回一个标签,或者返回同一任务的多个数组,每个数组都有一个不同的标签。
我的查询结构应该是什么样的?
谢谢!
我觉得有点尴尬,因为可能有一个简单的解决方案,但我不知道足够多的 MySQL 来做到这一点。如何使用一个查询从每个表中获取数据,然后返回一个数组,如下图所示?我所做的每一次尝试最终都会返回一个标签,或者返回同一任务的多个数组,每个数组都有一个不同的标签。
我的查询结构应该是什么样的?
谢谢!
图像的数组实际上显示了两次查询后数据的样子,而不是一次。为了能够在单个查询中完成,这是因为数据不太复杂,您可以使用 aGROUP_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']);
请注意,此示例没有任何数据验证、连接信息或其他逻辑,应仅用作如何将数据拆分为所需结构的粗略想法。