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

标签 php mysql join one-to-many

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

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

谢谢!

http://i.stack.imgur.com/ViqEs.png

最佳答案

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

获取所有请求数据的 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']);

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

关于php - 查询具有一对多关系的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515354/

相关文章:

php - 使用删除查询时 PHP 代码中的结果始终为 TRUE

php - 婚礼网站RSVP数据库

sql - 不同的混合行值?

PhpStorm将数据从CSV文件导入MySQL,西里尔问题

mysql - 更改字符串(文本到列函数)

php - Yii2 db getStats(db查询数)

php - 将动态添加的行中的值添加到数据库中

mysql - 为什么我运行 group by 和 order by 时结果不合适?

mysql - SQL 问题 - "WHERE NOT EXISTS"

python - 如何为 Django Q 对象动态加入多个参数