具有2个JOIN的MySQL查询未返回预期结果

时间:2013-07-11 23:35:07

标签: mysql

我有以下3个表格。这只是数据的一小部分,我遗漏了大多数行和其他我不反对的列。如果包括完整的表格会有帮助,请告诉我,我可以弄清楚如何发布它们。

infocoms

id    items_id  itemtype         value      
1735  21        Software         0.0000     
1736  22        Software         0.0000     
1739  21        Peripheral       151.2500   
1741  23        Peripheral       150.5000   
1742  24        Peripheral       0.0000     
1743  25        Peripheral       0.0000      

地点

id  name    
34  Anaheim
35  Kirkland  
36  Palm Springs  
37  Tacoma  

外围设备

id  name                                                          locations_id  
11  Logitech USB Wheel Mouse                                      0             
12  Samsung Slate Dock                                            17            
21  USB Scan Gun with Stand                                       34            
23  USB Scan Gun with Stand                                       63            
24  USB Scan Gun with Stand                                       45            
26  USB Scan Gun with Stand                                       39

我正在针对这些表运行以下查询:

SELECT peripherals.name, infocoms.value, locations.name AS Branch
FROM peripherals
JOIN infocoms ON peripherals.id = infocoms.items_id
JOIN locations ON peripherals.locations_id = locations.id
WHERE (peripherals.name = 'USB Scan Gun with Stand'
AND peripherals.locations_id != '0')
GROUP BY peripherals.id ORDER BY locations.name ASC

我得到了正确的行数,但是值显示为0.0000而不是实际金额(151.25和150.50)。

非常感谢任何帮助或见解。感谢。

3 个答案:

答案 0 :(得分:1)

评论(因为我没有声誉):“值”和“名称”应该包含在后面的标记中(``),因为它们是保留字。

但仔细查看你的代码我发现你按location.name进行分组,即使你执行JOIN ON peripherals.locations_id = locations.id.

时很多值都是重复的

之后会发生的是,GROUP其他语句通过location.name给出了没有与peripheral.locations_id关联的位置名称的所有位置的第一个结果

尽量不要使用GROUPING BY,看看你得到了什么。为了获得您想要的结果,您需要省略JOIN ON peripherals.locations_id = locations.id或将每个peripials.locations_id关联到适当的locations.id

答案 1 :(得分:0)

@Eugene Scray对于GROUP BY是正确的,因为你只看到一些值。 要使列“未分组”,您需要将这些列添加到GROUPING子句中。例如:

GROUP BY peripherals.id, infocom.value

答案 2 :(得分:0)

WHERE子句中,我添加了AND infocoms.itemtype = 'Peripheral',它返回了正确的行数以及相应的值。