我正在为我的家庭作业分配一个问题,我必须检查一个订单数据库,看看是否有任何书籍以相同的顺序被多次订购。 这是一个例子:
+----------+------------+---------+----------+-------------+
| 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)
感谢任何建议帮助!
答案 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的重复项。