SELECT*FROM多个表.MySQL的

Nes*_*Web 65 mysql multiple-tables

SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id

yeilds 5行(5个数组),photo是一行中唯一的唯一字段.name, price重复(这里, fanta- name, price 重复3次.)我如何摆脱这些重复?

编辑: 我想要name, pricephoto每个饮料的所有.

 id      name      price
  1.    fanta        5
  2.     dew         4


 id      photo                   drinks_id
  1.     ./images/fanta-1.jpg      1
  2.     ./images/fanta-2.jpg      1  
  3.     ./images/fanta-3.jpg      1 
  4.     ./images/dew-1.jpg        2
  5.     ./images/dew-2.jpg        2
Run Code Online (Sandbox Code Playgroud)

lee*_*mes 94

你在这里做的是a JOIN(虽然你隐式地这样做,因为你从多个表中选择).这意味着,如果您没有在WHERE子句中添加任何条件,则您拥有这些表的所有组合.只有在您符合条件的情况下,才能将您的加入限制为饮酒ID匹配的行.

但是如果有特定drink_id的X张照片,每个饮品的结果中仍然有X个多行.你的陈述不限制哪个你想有张相片!

如果您每个饮料只需要一行,那么如果有多行具有特定的drink_id,则必须告诉SQL您要执行的操作.为此,您需要分组和聚合函数.您告诉SQL要将哪些条目组合在一起(例如,所有相等的drink_id),并且在SELECT中,您必须告知应该采用每个分组结果行的哪些不同条目.对于数字,这可以是平均值,最小值,最大值(仅举几例).

在你的情况下,如果你只想要一行,我就看不出要查看照片的意义了.您可能认为每个饮料的结果中都有一系列照片,但SQL无法做到这一点.如果您只想要任何照片并且不关心您将获得哪些照片,请按drink_id进行分组(每个饮品只能获得一行):

SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id
Run Code Online (Sandbox Code Playgroud)

name     price   photo
fanta    5       ./images/fanta-1.jpg
dew      4       ./images/dew-1.jpg
Run Code Online (Sandbox Code Playgroud)

在MySQL中,如果您希望将文件名连接到一个字符串,我们还有GROUP_CONCAT:

SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id
Run Code Online (Sandbox Code Playgroud)

name     price   photo
fanta    5       ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg
dew      4       ./images/dew-1.jpg,./images/dew-2.jpg
Run Code Online (Sandbox Code Playgroud)

但是,如果您,在字段值内,这可能会变得很危险,因为很可能您希望在客户端再次拆分它.它也不是标准的SQL聚合函数.

  • 您使用哪种语言编写执行这些查询的程序?因为MySQL不支持数组作为字段类型.你必须做一些像`GROUP_CONCAT`这样的字符串技巧并再次拆分它.人们通常不会在关系数据库中这样做.您应该在程序中进行分组,而不是在SQL中进行分组(检测重复的ID并在程序中构建这些数组). (3认同)