在导出订购了多个产品的订单时,我无法删除重复数据。
示例:
orders_id, product_id, customer_first_name, customer_last_name
001 , ProductA , FirstName , LastName
001 , ProductB , FirstName , LastName
001 , ProductC , FirstName , LastName
002 , ProductA , FirstName , LastName
003 , ProductB , FirstName , LastName
003 , ProductC , FirstName , LastName
004 , ProductA , FirstName , LastName
我需要删除重复数据,如下所示:
orders_id, product_id, customer_first_name, customer_last_name
001 , ProductA , FirstName , LastName
, ProductB , ,
, ProductC , ,
002 , ProductA , FirstName , LastName
003 , ProductB , FirstName , LastName
, ProductC , ,
004 , ProductA , FirstName , LastName
我尝试了DISTINCT,没有任何改变。
假设提取上述内容的查询如下:
SELECT
o.orders_id
, op.product_id
, o.customer_first_name
, o.customer_last_name
FROM orders AS o
, orders_products AS op
WHERE o.orders_id = op.orders_id;
如何限制数据重复?
非常感谢!
和平 克里斯
答案 0 :(得分:3)
问题在于如何构建order_products表。由于order_id在该表中多次重复,因此每当您加入order_id时,您将返回相同数量的行
我假设桌子看起来像这样:
order_id product_id
001 ProductA
001 ProductB
001 ProductC
使用当前查询,每个product_id将始终返回3行。
您可能最好返回使用Group_Concat命令将product_ids连接在一起的扁平“产品”字段:
SELECT o.orders_id
,GROUP_CONCAT(DISTINCT op.product_id SEPARATOR ', ')
FROM orders AS o
, orders_products AS op
WHERE o.orders_id = op.orders_id
GROUP BY o.orders_id;
这将返回类似于以下内容的内容:
order_id products
001 ProductA, ProductB, ProductC
答案 1 :(得分:0)
在执行select语句时,请查看o.orders_id上的DISTINCT。 http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html
更新......我没有看到你已经尝试过了。也许尝试GroupBy http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html并按order_id分组。
答案 2 :(得分:0)
如果我理解您的要求,您仍然会尝试从所有订单中找回所有产品的完整列表。
您基本上有两个选择:
使用嵌套循环在服务器上发送大量查询:
通常更有效率的是获取所有内容,然后使用一些if / then逻辑:
PHP可能有办法专门处理第二种情况。我使用它已经好几年了,但它是ColdFusion中推荐的方式......看看'cfoutput'的'group'参数。
答案 3 :(得分:0)
你没有任何重复的结果,你得到的正是你所要求的。
既然和订单可以有很多产品,你得到的所有产品都属于一个订单,但订单ID将永远是重复的,关系数据库中没有办法将它全部放在一行,除非你压扁你的结果
答案 4 :(得分:0)
这是一个显示问题,而不是SQL问题。它可以用SQL解决,但查询会相当糟糕(在MySQL中)。
要解决的一种方法是使用@Bauhaus建议和GROUP_CONCAT()
函数稍微改变显示。
另一种方法是更改应用程序代码以组合两个查询的结果:
--- Get orders
SELECT
o.orders_id
--- REMOVED: op.product_id
, o.customer_first_name
, o.customer_last_name
FROM orders AS o
ORDER BY o.orders_id ; --- Order both queries by orders_id
--- to help the application code
--- match related data
--- Get order details (products)
SELECT
o.orders_id
, op.product_id
--- REMOVED: o.customer_first_name
--- REMOVED: o.customer_last_name
FROM orders AS o
JOIN orders_products AS op --- Don't use WHERE for joining tables,
ON o.orders_id = op.orders_id --- use the JOIN ... ON syntax
ORDER BY o.orders_id ;
--- Combine results
/* application code */