Вы можете сделать это следующим образом
SELECT * FROM
(
SELECT
(@rownum:=@rownum + 1) as rownumber, q.*
FROM (
SELECT
* /*shortened for readability*/
FROM company
LEFT JOIN company_address ON company.company_id = company_address.company_id
LEFT JOIN company_page ON company.company_id = company_page.company_id
LEFT JOIN company_contact ON company.company_id = company_contact.company_id
, (select @rownum:=0) r
) q
) asdf
WHERE rownumber BETWEEN 2 AND 3 /*or whatever*/
РЕДАКТИРОВАТЬ: Чтобы объяснить немного больше:
Этот
, (select @rownum:=0) r
объявляет и инициализирует переменную, которая будет служить нашим номером.
Если бы вы включили @rownum
в список SELECT
вашего самого внутреннего запроса, вы бы получили столбец со значением 0 в каждой строке.
Таким образом, вы делаете этот внутренний запрос подзапросом и просто добавляете 1 к переменной @rownum.
Только с этим
SELECT
(@rownum:=@rownum + 1) as rownumber, q.*
FROM (
SELECT
* /*shortened for readability*/
FROM company
LEFT JOIN company_address ON company.company_id = company_address.company_id
LEFT JOIN company_page ON company.company_id = company_page.company_id
LEFT JOIN company_contact ON company.company_id = company_contact.company_id
, (select @rownum:=0) r
) q
у вас уже есть номер. Поскольку вы не можете ссылаться на псевдоним столбца rownumber
в предложении WHERE
, вам придется написать что-то вроде
WHERE (@rownum:=@rownum + 1) BETWEEN 2 AND 3 /*or whatever*/
но это приведет к ложным результатам, потому что переменная @rownum
будет снова увеличена, а ваше число будет равно
2
4
6
и так далее. Поэтому вы должны поместить его в другой подзапрос, а затем вы можете «ограничить» свой запрос с помощью предложения WHERE.
Есть еще вопросы?