2010-05-12 99 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

相关问题