如何在 MySQL 中从多个表中进行选择
本篇文章介绍了如何在一个脚本中使用 MySQL 从多个表中查询 SELECT
。
让我们演示一种情况:
SELECT name, price, details, type, FROM food, food_order WHERE breakfast.id = 'breakfast_id'
现在,让我们想象一下每个 FROM
条目的示例表。
-
food
-
food_menu
根据上面的表,我们可以看到鸡蛋有 3 张照片,冰淇淋也有 3 张,而拉面有 2 张,我们要输出的是一个 food
和 food_menu
的聚合表,将所有的食物显示在一起,并结合菜单中相应的照片。
如果我们对此进行查询。
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
结果会是这样的:
数据是重复的,因为 food_menu
中有多行与 food
相关的数据。在本例中,food_menu
中有 3 张照片是直接与 Eggs 绑定的。
简单的查询不可能将 food_menu
中的所有条目连接到一条记录中,因为它们都被认为是与表 food
相关的独立实体。
如果你想同时在一行中查询 food
和 food_menu
,那么这里有几个选项。
使用 GROUP BY food
从多个表中 SELECT 的方法
这种方法使用 GROUP BY
将两张表汇总到一个结果中。但缺点是,你只能得到 food_menu
的第一个实例,因为我们强迫结果是唯一的。
下面是对 GROUP BY
food
表的查询。
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
它将显示以下结果。
现在我们已经满足了条件,尽管只返回了一张照片,这是查询发现的第一个 food_menu
实例。
在 MySQL 中使用 JOIN
从多个表中 SELECT
这种方法利用了 SQL 的 JOIN
或 RIGHT JOIN
命令。
我们在脚本中没有 2 个 FROM
条件,而是根据它的 food_id
外键来连接 food_menu
。我们将 f
作为 food
的别名,将 fm
作为 food_menu
的别名。
SELECT f.name, f.price, f.options, fm.food_menu
FROM food AS f
JOIN food_menu AS fm ON fm.food_id = f.food_id
WHERE food_id = '1'
GROUP BY f.food_id
虽然这个方法与前一个方法不同,但它产生的结果是一样的。它返回的是 food_menu
的第一个实例,因为 GROUP BY 迫使查询根据其条件返回唯一的行。
在 MySQL 中使用 GROUP_CONCAT()
并处理结果
上一个解决方案的变通方法是使用 GROUP_CONCAT()
将 food_menu
的所有结果放在一个单一的字符串中,因此可以将他们的所有记录放在一个行中。
什么是 GROUP_CONCAT()
GROUP_CONCAT
是一个将多行数据合并到一个字段的函数。它是一个 GROUP BY
的特殊函数,如果组中至少包含 1 个非空值,则返回一个修改后的字符串。否则就返回 NULL
。
我们将上面的查询修改为 GROUP_CONCAT()
照片列,将结果连成一个字符串。
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
通过这样做,我们将 food_menu
的照片列连接起来,这样每条 food
的唯一条目将只产生一条记录。结果将如下所示。
正如你所看到的,它连接了 3 个与 Eggs 相关的 food
表中的 photo
列。
如果我们把 GROUP BY
和 WHERE
条件去掉的话
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
结果是这样的
在使用 GROUP_CONCAT()
时一定要小心,如果你的字符串中包含一个逗号,而你的 CONCAT
定界符也是一个逗号,那么在解析你的列时就会破坏你的数据。
所以在使用这个函数之前,请确保你的定界符对于你要操作的列来说是一个无效的字符。
相关文章
在 Pandas 中执行 SQL 查询
发布时间:2024/04/24 浏览次数:1195 分类:Python
-
本教程演示了在 Python 中对 Pandas DataFrame 执行 SQL 查询。
SQL 和 MySQL 的区别
发布时间:2024/03/25 浏览次数:200 分类:MySQL
-
本文解释了 SQL 和 MySQL 之间的五个区别。我们的解释将包括代码和文字,因此你将对 SQL 和 MySQL 之间的区别有一个清晰的了解。
JavaScript 中的 SQLite 数据库
发布时间:2024/03/21 浏览次数:126 分类:JavaScript
-
本教程展示了如何使用 JavaScript 语言对 SQLite 数据库执行各种 CURD 操作。
在 PowerShell 中运行 SQL 查询
发布时间:2024/02/06 浏览次数:185 分类:编程语言
-
本文介绍如何调用 SQL 服务器的命令、执行 CRUD 操作以及查询 SQL 的其他替代方法。
使用 PowerShell 检查 SQL Server 版本
发布时间:2024/02/06 浏览次数:167 分类:编程语言
-
本教程将教你使用 PowerShell 检查 SQL Server 版本。检查程序的版本是你可以在 PowerShell 中执行的常见操作之一。
在 C# 中进行 SQL 插入查询
发布时间:2024/02/03 浏览次数:123 分类:编程语言
-
有两种主要方法可用于将记录插入 C# 中的数据库中:直接查询方法和参数化查询方法。使用 C# 中的简单查询方法进行 SQL 插入
在 C# 上连接到 SQL 数据库
发布时间:2024/02/01 浏览次数:102 分类:编程语言
-
本教程演示如何使用 SqlConnection 对象连接到 C# 上的 SQL 数据库。本教程将演示如何使用 SqlConnection 对象连接到 C# 上的 SQL 数据库。
在 C# 中选择查询数据库
发布时间:2024/02/01 浏览次数:174 分类:编程语言
-
关于在 C# 中使用 SELECT 查询设置数据库连接和检索记录的完整编程教程。本文将指导你建立与 C# 应用程序的数据库连接,并使用数据库中的 SELECT 查询从不同的表中获取数据。
C# 中 SQL Bigint 的等价物
发布时间:2024/01/20 浏览次数:257 分类:编程语言
-
本教程展示了 C# 中与 SQL bigint 等效的数据类型。使用 C# 中的 BigInteger 结构作为 SQL bigint 的等价物