【问题标题】:Mysql - select from multiple tables without producing duplicate data [closed]Mysql - 从多个表中选择而不产生重复数据[关闭]
【发布时间】:2015-02-05 01:51:56
【问题描述】:

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

表格如下:

客户

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    

客户评价

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 列被重复数据填充。

谢谢!

【问题讨论】:

  • 发布你想要的结果
  • @worldofjr 联合查询需要具有相同数量的列,所以这在我的情况下不起作用。
  • @bad_boy 结果已经发布了..?

标签: php mysql select join


【解决方案1】:

有一些方法可以丢弃重复项(SELECT DISTINCT、UNION、GROUP BY),但尚不清楚用户是更新现有评级还是创建新评级。以及您希望看到的内容:最后的评分或平均评分

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

  • order 表将包含order_id、customer_id和其他与订单相关的内容,例如order_date

  • products 表格将描述您的每道菜及其价格、描述等信息

  • order_products 包含字段order_id 和prduct_id 的表

  • 如果用户对产品进行评分,那么您的评分表至少需要product_id、customer_id、rate_value。我还要添加ratingDate 这样您就可以获得平均值或通过Max(ratingDate) 选择最后一个

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,但我不想将某个项目与其评级相关联。
    【解决方案3】:

    我对 MySQL 没有任何经验,但我认为它的工作原理类似于 MSSQL。

    因此,您期望的输出格式是不可能的。您可以将 order 和 rating 列值以逗号分隔

    Here 是类似的问题,可能会对您有所帮助

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

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

    【讨论】:

    • @MisterDood 我同意,会尝试纠正它
    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多