下面是做了GROUP BY
派生表子查詢,所以你只能得到一個解決方案每個電影標題行,並從中計算出ROW_NUMBER()
。
然後在外部查詢中再次將派生表的結果加入st
。每個電影標題仍會有多行,但RowNum
將會重複,因此您可以正確篩選@pageIndex
。
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY " + orderField + @") AS RowNum,
mt.ID AS mt_ID,
mt.title AS mt_title,
[...]
FROM mt AS mt
INNER JOIN sttable AS st ON mt.ID =st.ID
WHERE mt.title = @variable
GROUP BY mt.ID
) mt1
INNER JOIN sttable AS st1 ON (mt1.ID = st1.ID)
WHERE mt1.RowNum BETWEEN
((@pageIndex - 1) * @pageSize + 1) AND @pageIndex*@pageSize;
你必須遍歷在你的顯示器的代碼外查詢的結果,並開始輸出的新行每當值RowNum
變化。這是一個非常明顯的技術。
如果你不想做類似MySQL的GROUP_CONCAT()
函數,這在Microsoft SQL Server中是非常棘手的(我假設你使用的是Microsoft)。
查看類似http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html的博客,描述了使用FOR xml PATH ('')
技巧。
PS:由於您的口頭描述,您的示例SQL查詢沒有意義,所以我盡我所能寫了一些合理的東西。無法保證它與您的模式相匹配。
回覆您的留言:我不認爲你需要子查詢中的任何st
列訂購。我打算沒有包含在子查詢的選擇列表中的st
列。在子查詢中加入st
實例的唯一原因是將mt
的行限制爲那些在st
中具有匹配行的行。但GROUP BY mt.ID
確保每行只有一行mt
(實際上,因爲這是SQL Server,而不是MySQL,所以需要命名GROUP BY
子句中的選擇列表的所有mt
列)。
重新您的第二個評論:
我想有已經最近添加
您可以添加其他列分組對應的ST記錄第一顯示器MT行查詢您是否使用分組功能。例如,最新的date_added
每組mt
是MAX(st.date_added)
,您可以將此列添加到子查詢中。
但是,請勿在子查詢中使用ORDER BY
。有很少有任何理由來排序的子查詢,因爲順序可以通過使用子查詢結果無論如何改變了JOIN或其他操作你在使用子查詢
你應該在外部查詢排序:
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY " + orderField + @") AS RowNum,
mt.ID AS mt_ID,
mt.title AS mt_title,
[...] -- other mt.* columns
MAX(st.date_added) AS latest_date_added
FROM mt AS mt
INNER JOIN sttable AS st ON mt.ID =st.ID
WHERE mt.title = @variable
GROUP BY mt.ID, -- other mt.* columns
) mt1
INNER JOIN sttable AS st1 ON (mt1.ID = st1.ID)
WHERE mt1.RowNum BETWEEN
((@pageIndex - 1) * @pageSize + 1) AND @pageIndex*@pageSize
ORDER BY mt1.latest_date_added DESC, st1.date_added DESC;
不確定要了解您在那裏嘗試實現的目標。查詢返回所有具有相應mt和st的行。你想知道每個MT有多少記錄? – MPelletier 2009-11-25 00:15:51