2010-03-26 69 views
2

我需要对我做什么是一种先进的排序。我有这样的两个表:复杂的订单子句?

 
Table: Fruit 

fruitid | received | basketid 
    1  20100310 2 
    2  20091205 3 
    3  20100220 1 
    4  20091129 2 

Table: Basket 
id | name 
1 Big Discounts 
2 Premium Fruit 
3 Standard Produce 

我什至不知道我可以清楚地说出我要如何排序(这也许是我似乎无法编写代码来做到这一点的很大一部分原因,大声笑)。

我做一个连接查询,需要排序,所以一切都是由basketid组织。具有最早fruit.received日期的basketid首先出现,然后其他行按照日期asc相同的basketid,然后是具有下一个最早的fruit.received日期的basketid,接着是具有相同的basketid的其他行,依此类推。

所以输出应该是这样的:

 
Fruitid | Received | Basket 
    4  20091129  Premuim Fruit 
    1  20100310  Premuim Fruit 
    2  20091205  Standard Produce 
    3  20100220  Big Discounts 

任何想法如何在一个单一的执行做到这一点?

回答

2

试试这个(SQL Server表设置代码,但查询应在任何数据库工作)

DECLARE @Fruit table (fruitid int, received int, basketid int) 
INSERT @Fruit VALUES(1,  20100310, 2) 
INSERT @Fruit VALUES(2,  20091205, 3) 
INSERT @Fruit VALUES(3,  20100220, 1) 
INSERT @Fruit VALUES(4,  20091129, 2) 

DECLARE @Basket table (id int,basket varchar(20)) 
INSERT @Basket VALUES (1, 'Big Discounts' ) 
INSERT @Basket VALUES (2, 'Premium Fruit' ) 
INSERT @Basket VALUES (3, 'Standard Produce') 


SELECT 
    f.Fruitid ,f.received,b.basket 
    FROM @Fruit f 
     INNER JOIN (SELECT 
         basketid, MIN(received) AS received 
         FROM @Fruit 
         GROUP BY basketid 
       ) o ON f.basketid = o.basketid 
     INNER JOIN @Basket b ON o.basketid=b.id 
    ORDER BY o.received 

输出

Fruitid  received basket 
----------- ----------- -------------------- 
4   20091129 Premium Fruit 
1   20100310 Premium Fruit 
2   20091205 Standard Produce 
3   20100220 Big Discounts 

(4 row(s) affected) 
+0

认为你应该将ORDER BY更改为ORDER BY o.received,f.received – sgmoore 2010-03-26 15:40:40

+0

@sgmoore,是的,我发现在@Quassnoi将它添加到他的查询后 – 2010-03-26 16:08:07

2
SELECT f.fruitid, f.received, ba.name AS basket 
FROM Fruit f 
JOIN (
     SELECT basketid, MIN(received) AS mr 
     FROM fruit 
     GROUP BY 
       basketid 
     ) b 
ON  f.basketid = b.basketid 
JOIN basket ba 
ON  ba.id = f.basketid 
ORDER BY 
     b.mr, f.basketid, f.received 
+0

这并没有给该OP希望 – 2010-03-26 15:18:52

+0

列@ KM:现在确实,而不是因为我的编辑。 – 2010-03-26 15:34:03

+0

没有'f.mr'命令应该是b.mr; '来自Friut'应该水果; 'ON f.backetid'应该是f.basketid; ',ba.name'应该是ba.basket – 2010-03-26 15:34:24