Mysql - 从多个表中选择而不产生重复数据

时间:2014-12-07 07:09:07

标签: php mysql select join

我有三个表,我想从表中选择而不产生重复。

表格如下:

客户

id     |     name   |     lastName  
---------------------------------------
1      |    john    |      doe
2      |    helen   |      keller    

订单

userID列是引用John Doe的外键,因此John订购了3个项目。

id     |   userID   |     order 
---------------------------------------
1      |    1       |      pizza
2      |    1       |      pasta
3      |    1       |      lasagna    

CustomerRating

userID列是引用John Doe的外键,因此John留下5条评论。

 id     |   userID  |     rating   |  comment
-------------------------------------------------
1      |    1       |      5/5     |  was good
2      |    1       |      5/5     |  excellent
3      |    1       |      4/5     |  great
4      |    1       |      4/5     |  great
5      |    1       |      4/5     |  great

我如何从3个表中选择哪里可以获得如下所示的返回结果?

id     |     name   |     lastName    |   order      |   rating
-----------------------------------------------------------------
1      |    john    |      doe        |   pasta      |   5/5
       |            |                 |   pizza      |   5/5
       |            |                 |   lasagna    |   4/5
       |            |                 |              |   4/5
       |            |                 |              |   4/5

我已尝试加入这些表格,但由于John已经留下5条评论并且只订购了3次,因此id,name,lastName和order列会填充重复的数据。

谢谢!

3 个答案:

答案 0 :(得分:1)

我没有任何MySQL经验,但我认为它与MSSQL类似。

因此无法使用您期望输出的格式。您可以将订单和评级列值以逗号分隔

Here是一个类似的问题,可以帮助你

包括基于链接的示例 试试这样的事情

SELECT Customers.id, Customers.name, Customers.lastName, GROUP_CONCAT(Orders.order) OrderedDishes, GROUP_CONCAT(CustomerRating.rating) RatingsGiven FROM ..... rest of your query .....

答案 1 :(得分:1)

有多种方法可以放弃重复项(SELECT DISTINCTUNIONGROUP BY),但目前尚不清楚用户是更新现有评级还是创建新评级。你想看到的是:最后一个评级还是平均评分

另一方面 - 我会改变你的整个设置:

  • order表格包含order_idcustomer_id和其他与订单相关的内容,例如order_date

  • products表格,描述您的每道菜以及价格,描述等信息

  • order_products表格,其中包含字段order_idprduct_id

  • 如果用户评价产品,那么您的评分表至少需要product_idcustomer_idrate_value。我还要添加ratingDate这样您就可以获得平均值,或者按Max(ratingDate)

  • 选择最后一个。

答案 2 :(得分:0)

我认为您需要在CustomerRating表中添加orderID字段,否则无法将项目与其评级相关联。