2009-11-09 113 views
0

我運行下面的SQL查詢:飼養訂貨

SELECT * FROM cms_albums WHERE id IN (SELECT album_id FROM cms_albums_collections WHERE collection_id = 1 ORDER BY position ASC) 

現在,假設內部查詢

SELECT album_id FROM cms_albums_collections WHERE collection_id = 1 ORDER BY position ASC 

返回如下:

album_id 
"4" 
"2" 

這是我想要的訂單。 然而整個查詢將返回:

id name 
"2" "Second album" 
"4" "First album" 

我假定這是因爲條目是在「cms_albums」表的順序。 有沒有什麼辦法可以讓我的整體結果按照內部查詢給出的順序?

感謝

回答

2

嘗試這種變化:

SELECT DISTINCT c.* 
FROM cms_albums c 
JOIN cms_albums_collections cc 
ON  c.id = cc.album_id 
WHERE cc.collection_id = 1 
ORDER BY 
     cc.position ASC 

在IN列表中的項目的訂單丟失,而是形成一個連接,那麼你可以申請你想要的訂貨。

+2

使用'SELECT DISTINCT c。* ...',因爲集合在理論上可能會多次包含給定的相冊ID。 –

+0

@Bill - thx,完成。 –

+0

工作就像一個魅力!非常感謝! –

1

我不同意這樣的說法:返回的結果必然是表格的順序或行插入表格的順序。如果服務器使用的執行計劃使用了非聚集索引或內存數據集,則排序順序不一定反映實際表的順序或插入數據的順序。話雖如此,有可能實現自己的目標的幾個選項:

  1. 而不是使用IN語句,你可以通過二次表的聚集索引使用JOIN,然後排序。
  2. 修改後的版本爲1.如果子查詢返回多個行,每個albumn id然後聚合在CTE或子查詢中的數據。您仍然需要對聚集索引進行排序。