Вот решение, которое делает 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-запроса не имеет смысла, учитывая ваше словесное описание, поэтому я сделал все возможное, чтобы написать что-то разумное. Нет гарантий, что он соответствует вашей схеме.
Re ваш комментарий: Я не думаю, что вам нужно сделать заказ на любой колонке st
внутри подзапроса. Я предполагал, что не будет столбцов от st
, включенных в список выбора подзапроса. Единственная причина, по которой есть экземпляр st
, связанный в подзапросе, состоит в том, чтобы ограничить строки mt
теми, у которых есть соответствующие строки в st
. Но GROUP BY mt.ID
гарантирует, что есть только одна строка в строке mt
(фактически, поскольку это SQL Server, а не MySQL, вам нужно будет назвать все столбцы списка выбора в предложении GROUP BY
).
Re ваш второй комментарий:
Я хочу первых дисплей мт строк, которые имеют соответствующие ул записи, которые были недавно добавлены
Вы можете добавить другие столбцы сгруппированных запрос, если вы используете функции группировки. Например, последние 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. Вы хотите знать, сколько записей st для каждого mt? – MPelletier