如何限制MySQL查询中的重复列结果?

时间:2011-10-14 18:24:24

标签: mysql

在导出订购了多个产品的订单时,我无法删除重复数据。

示例:

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;

如何限制数据重复?

非常感谢!

和平 克里斯

5 个答案:

答案 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)

如果我理解您的要求,您仍然会尝试从所有订单中找回所有产品的完整列表。

您基本上有两个选择:

使用嵌套循环在服务器上发送大量查询:

  1. 从订单表中获取商家信息
  2. 对于每条记录,请询问orders_products表中的相关记录。
  3. 打印第一行w /第一条相关记录的合并信息
  4. 循环显示其余结果,仅打印产品信息
  5. 通常更有效率的是获取所有内容,然后使用一些if / then逻辑:

    1. 初始化变量以跟踪最后的order_id。
    2. 遍历合并列表(您开始使用的内容)
    3. 如果当前order_id与上一个order_id不同,请打印完整记录...否则,只打印产品信息。
    4. 使用当前order_id更新最后一个order_id。
    5. 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 */