2014-12-07 90 views
1

我有三个表,我希望从表中选择而不产生重复。Mysql - 从多个表中选择而不产生重复的数据

表如下:

客户

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

订单

的用户ID列是一个外键引用李四,所以约翰订单3项。

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

CustomerRating

的用户ID列是一个外键引用李四,所以约翰·叶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 

我已经试过加入这些表,但由于约翰已经离开5条的评论,只下令3次,ID,姓名,姓氏和订单列被填充了重复数据。

谢谢!

+0

可能重复的最后一个(http://stackoverflow.com/questions/6066197/selecting -across-multiple-tables-with-union) – worldofjr 2014-12-07 08:03:53

+0

发布你想要的结果 – Yang 2014-12-07 08:19:34

+0

@worldofjr联合查询需要具有相同的列数,所以对我来说不起作用。 – hmzfier 2014-12-07 08:58:47

回答

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 .....

+0

尽管此链接可能回答此问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – 2014-12-07 07:35:48

+0

@MisterDood我同意,将尝试纠正它 – Vinay 2014-12-07 07:44:59

0

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

+0

谢谢,但我不想将一个项目与其评级相关联。 – hmzfier 2014-12-07 09:40:10

1

有许多方法可以丢弃重复项(SELECT DISTINCT,UNION,GROUP BY),但不清楚用户是更新现有评分还是创建新评分。你希望看到什么:最后一个等级或平均一个

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

  • order表将包含order_idcustomer_id等订单相关的东西一样order_date

  • products表会描述你的每一个菜肴,像他们的价格信息,描述等

  • order_products表的字段order_idprduct_id

  • 如果用户速率产品,那么你的等级表至少需要product_idcustomer_idrate_value。我也想补充ratingDate这样,你可以得到的平均值或选择[跨多个表的选择与UNION]的Max(ratingDate)