2012-03-29 11 views
1

Kann die Zeilennummer als ID zurückgegeben werden? Meiner Ansicht nach, wo ich meine Tabellen fusionieren kann ich nicht eine eindeutige ID machen, weil ich jeden Wert speichern create links müssen verbindet:Eine Zeilennummer als ID in den Ergebnissen einer Sphinx-Suche

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 

Wenn ich die Zeilennummer erhalten kann ich nur tun SELECT * sphinx LIMIT 1 OFFSET rowNumber , um die Informationen dieser Zeile zu erhalten.

Danke für Ihre Zeit.

Antwort

2

Sie können es die folgende Art und Weise

SELECT * FROM 
(
SELECT 
(@rownum:[email protected] + 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*/ 

EDIT: ein bisschen mehr zu erklären:

Dieses

, (select @rownum:=0) r 

deklariert und initialisiert die Variable, die als unsere rownumber dienen . Wenn Sie @rownum in die SELECT Liste Ihrer innersten Abfrage einschließen würden, würden Sie eine Spalte erhalten, die den Wert 0 in jeder Zeile hat.

Also machen Sie diese innere Abfrage zu einer Unterabfrage und fügen Sie einfach 1 zur Variable @rownum hinzu. Mit nur dieser

SELECT 
(@rownum:[email protected] + 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 

würden Sie bereits eine rownumber haben. Da Sie nicht auf die Spalte alias rownumber in der WHERE Klausel beziehen, würden Sie so etwas wie

WHERE (@rownum:[email protected] + 1) BETWEEN 2 AND 3 /*or whatever*/ 

schreiben haben, aber dies zu falschen Ergebnissen führen würde, weil die @rownum Variable wieder bekommen erhöht würden und Ihre rownumber würden sein wie

2 
4 
6 

und so weiter. Deshalb müssen Sie es in eine andere Unterabfrage stellen und dann können Sie Ihre Anfrage über die WHERE-Klausel "begrenzen".

Noch Fragen?

+0

Es funktioniert wirklich .. DANKE !! Kannst du mir bitte erklären, was los ist? – Sem

+0

@Zundrium Redigiert meine Antwort. – fancyPants