2013-01-07 38 views
1

我想知道是否存在针对以下情况的解决方案。SQL - 通过父子连接中的子属性排序结果

我有一个表SALE(id, client_name, total) 和另一个表SALE_ITEM (id, sale_id, item_name, item_price)SALESALE_ITEM表之间的关系为1:n。

如果我在SALESALE_ITEM之间加入,我还可以(仅通过SQL)检索item_name为每次销售订购的结果吗?

例如:

SALE 
id   client_name     total 
1   John       200 
2   Aaron       1400 
3   Christian      500 

SALE_ITEM 
id   sale_id    item_name    item_price 
1   1      Ruler     100 
2   1      Crayon     100 
3   2      Bike      1100 
4   2      Gloves     300 
5   3      Jeans     500 

SALE JOIN SALE_ITEM (afer the ordering by sale_item#name field) 
sale_id  sale_client_name  sale_total  sale_item_id sale_item_name 
2   Aaron    1400   3    Bike 
2   Aaron    1400   4    Gloves 
1   John     200   2    Crayon 
1   John     200   1    Ruler 
3   Christian   500   5    Jeans 

正如可从上面观察到的,结果列于SALE_ITEM#item_name字段之后排序(见自行车,...,蜡笔,...,牛仔裤),与该提属于同一SALESALE_ITEM条目彼此相邻。

+0

也许您想要通过sale.client_name订购,然后通过sale_item.item_name订购? –

+1

您正在使用哪些DBMS?甲骨文? PostgreSQL的? –

回答

1

这应该给你的命令,你需要的行:

SELECT 
    S.*, SI.* 
FROM 
    SALE S JOIN SALE_ITEM SI 
    ON S.id = SI.sale_id JOIN 
    (select SALE_ITEM.sale_id, min(item_name) as min_name 
    from SALE_ITEM 
    group by SALE_ITEM.sale_id) SI_MIN 
    ON S.id=SI_MIN.sale_id 
ORDER BY SI_MIN.min_name, SI.id 

我排序由min_name firts为每销售,然后由SI.id.请see this fiddle

+0

感谢@fthiella的答案和指向我sqlfiddle.com网站。我已经用你提出的解决方案玩了一下,并根据它提出了我自己的小提琴,它实现了我期待的。有关信息,我可以在这里找到我的更改:http://sqlfiddle.com/#!2/f722e/1。我也使用了mysql的相关ROWNUM技巧:http://craftycodeblog.com/2010/09/13/rownum-simulation-with-mysql/因为在mysql中不支持它。 –

+0

@marius_neo不客气,也谢谢你! rownum模拟是一个不错的技巧,有时候非常有用,但我认为你可以通过'ORDER BY SI_MIN.min_name,SI.id,SI.item_name'命令来得到相同的结果。如果多个客户购买同一商品,结果可能会有所不同:我总是按第一个商品进行排序,然后用SI.id进行排序,而在您的查询中,具有相同商品的客户订单可能会有所不同,但它应该是还好 – fthiella

0
select sale_id, client_Name, total, sale_item.id, item_name 
from sale 
inner join sale_item on sale.id = sale_item.sale_id 
order by sale.id, item_name 
+0

我也到目前为止,但我想有自行车作为第一行结果集 –

0
SELECT * 
FROM SALE S 
JOIN SALE_ITEM SI 
    ON S.id = SI.sale_id 
ORDER BY SI.sale_id, SI.item_name