MySQL查询不返回每个选项的唯一价格

时间:2019-05-26 15:16:11

标签: mysql

我正在运行以下mySQL查询,该查询为每个产品选项返回了不正确的价格。 (出于测试目的,每个选件都有不同的价格)。

如何为每个选项返回单个价格?

可以在这里看到数据库模式: http://www.webassist.com/tutorials/Free-eCommerce-MySQL-Database

SELECT ProductName AS productname, ProductCategoryID, 
pov.OptionGroupName AS groupname,
povd.OptionName AS optionname, 
pd.OptionPrice as price

FROM products p 
LEFT JOIN productoptions pd ON (p.ProductID = pd.ProductID) 
LEFT JOIN optiongroups pov ON (pd.OptionGroupID = pov.OptionGroupID) 
LEFT JOIN options povd ON (pov.OptionGroupID = povd.OptionGroupID)

WHERE p.ProductID = 1
GROUP BY groupname, povd.OptionName 

当前得到这个(注意价格):

+-------------+-------------------+-----------+------------+-------+
| ProductName | ProductCategoryID | GroupName | OptionName | Price |
+-------------+-------------------+-----------+------------+-------+
| Item1       | 1                 | Color     | Black      | 2.00  |
| Item1       | 1                 | Color     | Red        | 2.00  |
| Item1       | 1                 | Color     | Blue       | 2.00  |
| Item1       | 1                 | Size      | Small      | 5.00  |
| Item1       | 1                 | Size      | Medium     | 5.00  |
+-------------+-------------------+-----------+------------+-------+

应该是这样(价格独特):

+-------------+-------------------+-----------+------------+-------+
| ProductName | ProductCategoryID | GroupName | OptionName | Price |
+-------------+-------------------+-----------+------------+-------+
| Item1       | 1                 | Color     | Black      | 2.00  |
| Item1       | 1                 | Color     | Red        | 3.00  |
| Item1       | 1                 | Color     | Blue       | 4.00  |
| Item1       | 1                 | Size      | Small      | 5.00  |
| Item1       | 1                 | Size      | Medium     | 6.00  |
+-------------+-------------------+-----------+------------+-------+

以下是所有相关表的数据集(感谢指导,草莓!)。

产品表

+-----------+-------------+-------------------+
| ProductID | ProductName | ProductCategoryID |
+-----------+-------------+-------------------+
| 1         | T-Shirt1    | 1                 |
+-----------+-------------+-------------------+

OptionGroups表

+---------------+-----------------+
| OptionGroupID | OptionGroupName |
+---------------+-----------------+
| 1             | color           |
| 2             | size            |
+---------------+-----------------+

ProductOptions表

+-----------------+-----------+----------+-------------+---------------+
| ProductOptionID | ProductID | OptionID | OptionPrice | OptionGroupID |
+-----------------+-----------+----------+-------------+---------------+
| 1               | 1         | 1        | 2.00        | 1 (color)     |
| 2               | 1         | 2        | 3.00        | 1 (color)     |
| 3               | 1         | 3        | 4.00        | 1 (color)     |
| 4               | 1         | 4        | 5.00        | 2 (size)      |
| 5               | 1         | 5        | 6.00        | 2 (size)      |
+-----------------+-----------+----------+-------------+---------------+

选项表

+----------+---------------+------------+
| OptionID | OptionGroupID | OptionName |
+----------+---------------+------------+
| 1        | 1             | black      |
| 2        | 1             | red        |
| 3        | 1             | blue       |
| 4        | 2             | Small      |
| 5        | 2             | Small      |
+----------+---------------+------------+

1 个答案:

答案 0 :(得分:1)

我接受了您的查询scaisEdge,并对其进行了一些更改。我删除了最小/最大的东西,更改了对ProductOptions进行Left Join的方式,并更改了Where子句和Group By。似乎工作正常:

+-------------+-------------------+-----------+------------+-------+
| ProductName | ProductCategoryID | GroupName | OptionName | Price |
+-------------+-------------------+-----------+------------+-------+
| Item1       | 1                 | Color     | Black      | 2.25  |
| Item1       | 1                 | Color     | Red        | 3.25  |
| Item1       | 1                 | Color     | Blue       | 4.25  |
| Item1       | 1                 | Size      | Small      | 5.25  |
| Item1       | 1                 | Size      | Medium     | 6.25  |
+-------------+-------------------+-----------+------------+-------+

此时的查询:

SELECT ProductName AS productname, ProductCategoryID, 
  pov.OptionGroupName AS groupname,
  povd.OptionName AS optionname, 
  pd.OptionPrice AS price,
  povd.OptionID AS optionid

  FROM products p 

  LEFT JOIN productoptions pd ON (pd.OptionID = optionid) 
  LEFT JOIN optiongroups pov ON (pd.OptionGroupID = pov.OptionGroupID) 
  LEFT JOIN options povd ON (pov.OptionGroupID = povd.OptionGroupID)

  WHERE p.ProductID = 1 and povd.OptionID = pd.OptionID

  GROUP BY povd.OptionID, 
  groupname, povd.OptionName

非常感谢scaisEdge在此方面的帮助。

感谢草莓公司指导我如何在网站上格式化我的问题。

我真正相信,如果成员“否决”一个问题,则必须要求他们解释原因,以便我们新手能够学习而不会被简单降级,也不会从中学到任何东西。