2014-04-15 66 views
0

我正在爲我的家庭作業的問題工作,我必須檢查一個訂單數據庫,看看是否有任何書籍以相同的順序多次訂購。 下面是一個例子:查詢得到重複

+----------+------------+---------+----------+-------------+ 
| 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,但我不能得到連接兩者的邏輯。 查詢是essentialy說:「相同的書?檢查!做了相關的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

請注意,在實踐中,這是不可能發生的,因爲PK(正確標準化的設計)將包括book_id。也就是說,如果order_ids相等,並且book_ids相等,order_lines不相等,則同一本書會多次訂購。 – Strawberry

回答

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(因爲一個訂單可能有兩個bookid,每個訂單都被排序兩次)。但是否則這應該完成這項工作(你遵循邏輯,是的?它使用子查詢來找出哪些訂單和書籍id不止一次地出現;從那裏抓取order_id,book_id和count_id列表中的order_id (),其中計數()> 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爲好。

+0

謝謝!通過兩者進行分組並使用SUM是非常有用的,這使得更有意義。我得到了我現在想要得到的。 –

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

+0

我投票選擇的查詢{SELECT order_id,COUNT(*)-COUNT(DISTINCT book_id)AS duplicate_count FROM a_bkorders.order_details GROUP BY order_id}將返回需要額外清理的結果。具體來說,它還會返回多個不屬於最終結果的ID,以及重複的ID。您的新查詢更好,但效率比count(*)....效率更低。group by order_id,book_id具有count(*)> 1。它還返回屬於結果集的order ID的重複項。我已經刪除了投票。但你的查詢仍然不是它應該的。 – evanv

+0

實際上,GROUP BY order_id將從最終結果中刪除dups ......從這個意義上說,我認爲它是正確的。它不如SELECT a有效。order_id FROM(SELECT COUNT(*)GROUP BY order_id,book_id HAVING count(*)> 1),但現在是正確的。無論如何,往下投票刪除。 – evanv

+1

謝謝,我總是喜歡聽如何改進。我不做很多數據庫工作。 –