查询以获取重复项

时间:2014-04-15 18:25:44

标签: mysql group-by subquery

我正在为我的家庭作业分配一个问题,我必须检查一个订单数据库,看看是否有任何书籍以相同的顺序被多次订购。 这是一个例子:

+----------+------------+---------+----------+-------------+ 
| order_id | order_line | book_id | quantity | order_price | 
+----------+------------+---------+----------+-------------+ 
| 33034    | 1          | 1619    | 1        | 29.99       | 
| 33034    | 2          | 6789    | 1        | 25.95       | 
| 33034    | 3          | 1619    | 5        | 15.95       | 
| 33189    | 1          | 1667    | 2        | 25.95       |
| 40564    | 1          | 4739    | 2        | 20.99       |
| 11357    | 1          | 1667    | 2        | 35.95       |

因此订购33034两次订购1619册。我无法弄清楚如何只提取正确的订单ID 截至目前,似乎我的查询可以测试多个相同的book_id,然后测试相关的order_id,但我无法获得连接这两者的逻辑。 该查询非常重要地说“同一本书?检查!相关的order_id订单比任何两本书更多吗?检查!”我需要它来确保它订购了不止一本相同的书。

我不能使用连接,只能使用子查询。 我很难把头包裹在下一步的地方,但这是我到目前为止所做的。

select order_id
from a_bkorders.order_details
where book_id in (
     select book_id     
     from a_bkorders.order_details
     group by book_id
     having count(book_id)>1)
group by order_id
having count(order_id)>1)

感谢任何建议帮助!

2 个答案:

答案 0 :(得分:2)

为什么不使用

SELECT a.order_id FROM
(SELECT order_id, book_id, COUNT(*)
FROM a_bkorders.order_details 
GROUP BY order_id, book_id 
HAVING count(*)>1
) AS a

从技术上讲,你应该使用SELECT DISTINCT(因为一个订单可能有两个book id,每个订单都被订购两次)。但是否则这应该可以完成这项任务(你遵循逻辑,是吗?它使用子查询来找出哪个顺序和书籍ID不止一次串联发生;从那里它从order_id,book_id和count的列表中抓取order_ids ()的计数()> 1)。

现在,这一切都在等待某个假设“如果任何一本书以相同的顺序被多次订购” - >任何两次显示为订单项的图书(例如,计数()> 1),而不是任何数量为>的图书。 1(例如计数()> 1或数量> 1)

如果您需要检查数量> 1或计数(*)大于1,我建议如下:

SELECT a.order_id FROM
(SELECT order_id, book_id, SUM(quantity)
FROM a_bkorders.order_details 
GROUP BY order_id, book_id 
HAVING SUM(quantity) > 1
) AS a

如果不明显,则SUM(数量)将> 1如果count(*)> 1.它还将>如果数量> 1,则为1 1也是。

答案 1 :(得分:0)

这样的事情怎么样:

SELECT order_id FROM    
  (SELECT order_id, COUNT(*) - COUNT(DISTINCT book_id) AS duplicate_count
    FROM a_bkorders.order_details
    GROUP BY order_id
  ) t
WHERE t.duplicate_count > 0

请注意,这是重复数量为0的重复项。