2010-05-12 87 views
2

假設我有一個order_dummy表,其中order_dummy_id, order_id, user_id, book_id, author_id存儲。你可能會抱怨我的桌子的邏輯,但我不知道需要這樣做。我想執行以下查詢。如何將幾乎相同的幾個查詢合併成一個?

SELECT * 
FROM order_dummy 
WHERE order_id = 1 
AND user_id = 1 
AND book_id = 1 
ORDER BY `order_dummy_id` DESC 
LIMIT 1 

SELECT * 
FROM order_dummy 
WHERE order_id = 1 
AND user_id = 1 
AND book_id = 2 
ORDER BY `order_dummy_id` DESC 
LIMIT 1 

SELECT * 
FROM order_dummy 
WHERE order_id = 1 
AND user_id = 1 
AND book_id = 3 
ORDER BY `order_dummy_id` DESC 
LIMIT 1 

請記住,一個訂單中包括幾個相同的書籍。因此,我通過降序列出order_dummy_id並限制1,因此只顯示A BOOK的最新訂單。但我的目標是在一張桌子上以這種方式展示其他書籍。我用group by這樣的...

SELECT * 
FROM order_dummy 
WHERE order_id = 1 
AND user_id = 1 
GROUP BY book_id 

,但它只能說明order_dummy_id有上升的結果。我不知道了。期待你的善意幫助!

回答

-1

您需要normalize你的表之間的關係。 書籍ID不應排序,因爲我們每個訂單可以有多本書。您需要有一個名爲「訂購物品」的表格,並將您的書籍與訂購數量一起存儲 - 無需多行。

要回答你的問題,我可以指出你的SQL操作IN

select * from table where id in (1,2,3) 

此外,根據上下文,你可以使用或操作

select * from table where id = 1 or id = 2 or id =3 
+1

@abatishchev請不要編輯我的英文H。 Normalize是我在英國居住的英國拼寫。 Normalize是美國人! – iBiryukov 2010-05-12 20:40:47

+0

好的,對不起,不知道 – abatishchev 2010-05-12 20:56:25

1

爲了讓多個選擇的結果一氣呵成UNION ALL

(
    SELECT * 
    FROM order_dummy 
    WHERE order_id = 1 
    AND user_id = 1 
    AND book_id = 1 
    ORDER BY `order_dummy_id` DESC 
    LIMIT 1 
) 
UNION ALL 
(
    SELECT * 
    FROM order_dummy 
    WHERE order_id = 1 
    AND user_id = 1 
    AND book_id = 2 
    ORDER BY `order_dummy_id` DESC 
    LIMIT 1 
) 
UNION ALL 
(
    SELECT * 
    FROM order_dummy 
    WHERE order_id = 1 
    AND user_id = 1 
    AND book_id = 3 
    ORDER BY `order_dummy_id` DESC 
    LIMIT 1 
) 
+0

感謝您的建議。如果我想在16個以上的查詢中進行聯合,那麼效率如何 – Devyn 2010-05-12 20:19:10

+0

@Devyn:如果您有一個索引(order_id,user_id,book_id,order_dummy_id),則此查詢將非常有效。但這是一個非常醜陋的問題。性能或可讀性/可維護性是決定使用哪種查詢的最重要方面? – 2010-05-12 20:24:47

+0

我真的沒有其他的辦法:(我儘可能地嘗試過,我可能會在未來改變這個查詢,但我必須向前邁出一步,完成我的項目。 – Devyn 2010-05-12 20:32:18

相關問題