2012-10-15 63 views
45

SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_idSELECT * FROM多个表。 MySQL

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

编辑:我想要name, price和所有photo为每个饮料。

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 
+4

那么你有5匹配的行,因为你有几行drink_id相同。你会期望*会发生什么?你希望保留哪张照片? –

回答

66

你在这里做什么是所谓的JOIN(虽然你做它含蓄,因为你从多个表中选择)。这意味着,如果您没有在您的WHERE子句中添加任何条件,那么这些表中的所有组合都是。只有在您的条件下,您才能将加入限制为饮料ID匹配的那些行。

但仍有X的结果多行,每喝一杯,如果有X的照片与此特定drinks_id。您的声明不限制哪个您想要的照片!

如果只想喝每一个行,你必须告诉SQL你想,如果有与特定drinks_id多行做什么。为此,您需要分组和aggregate function。您告诉SQL您想要将哪些条目组合在一起(例如所有相同的drinks_id),并且在SELECT中,必须告知应该采用每个分组结果行的不同条目。对于数字,这可以是平均值,最小值,最大值(仅举一些)。

在你的情况,我看不到感查询照片饮料,如果你只想要一行。您可能认为您的结果中可能会有阵列照片,但SQL无法执行此操作。如果你只是想任何照片,你不在乎,你会被drinks_id得到的,只是组(为了得到每饮料只有一行):

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

name  price photo 
fanta 5  ./images/fanta-1.jpg 
dew  4  ./images/dew-1.jpg 

在MySQL中,我们也有GROUP_CONCAT,如果你想要的文件名要连接到一个单一的字符串:

SELECT name, price, GROUP_CONCAT(photo, ',') 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id 
GROUP BY drinks_id 

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 

但是,如果在字段值中有,,这可能会变得很危险,因为很可能您想在客户端再次拆分它。它也不是一个标准的SQL聚合函数。

+0

是的,我想要每个饮料的名称,价格和图像阵列。 – NestedWeb

+1

图像数组...你真的知道什么是一个关系数据库吗? –

+2

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

0

为了通过drinks.id摆脱重复的,可以群。但是这样你每个drinks.id只能得到一张照片(你得到的照片取决于数据库的内部实现)。

虽然它没有记录,在MySQL的情况下,你会得到与最低id(以我的经验,我从来没有见过的其他行为)的照片。

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id 
GROUP BY drinks.id 
+1

你应该更好地通过id进行分组。始终按唯一字段进行分组,以获取源表的不同行。在你的情况下,如果两种饮料具有相同的名称(但是在表格中有不同的行),你也可以将它们组合在一起。 – leemes

+0

谢谢leemes,我没有注意到有唯一的id字段。我编辑了我的答案。当然使用id更好。 @ypercube,你真的觉得,你的评论增加了一些通常发布的内容吗? – bhovhannes

+0

@ bhovhannes:不,你说得对,对不起。 Snarky的评论没有添加任何有用的东西。更正的答案更好 - 尽管我仍然不同意这种使用“GROUP BY”(这不是SQL标准),没有解释它为什么会起作用以及它如何为每一杯饮料返回一个半随机的“照片”。 (*中的*“first”* *“你会得到第一张照片”*短语恰恰是错误的)。 –

2

您将有名称和价格在这里重复的值。而且id在drinks_photos表中是重复的。你无法避免它们。你究竟想要输出什么?