Номер строки как идентификатор в результатах поиска сфинкса - PullRequest
1 голос
/ 29 марта 2012

Можно ли вернуть номер строки в качестве идентификатора? На мой взгляд, где я объединяю свои таблицы, я не могу сделать уникальный идентификатор, потому что мне нужно создать слева объединяет для хранения каждого значения:

CREATE VIEW
sphinx
AS
SELECT

company.company_id,
company.company_name,
company.company_keywords,

company_address.address_street,
company_address.address_number,
company_address.address_telephone,
company_address.address_fax,
company_address.address_email,
company_address.address_website,
company_address.address_authorized,

company_contact.contact_name,
company_contact.contact_surname,
company_contact.contact_telephone,
company_contact.contact_mobilephone,
company_contact.contact_fax,
company_contact.contact_email,

company_page.page_content,
company_page.page_description,
company_page.page_keywords

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 * FROM sphinx LIMIT 1 OFFSET rowNumber чтобы получить информацию об этой строке.

Спасибо за ваше время.

1 Ответ

2 голосов
/ 29 марта 2012

Вы можете сделать это следующим образом

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.

Есть еще вопросы?

...