2010-11-23 12 views
2

Ich schaffte es, eine Abfrage für alle Freunde und Freunde von Freunden eines bestimmten Benutzers haben. Ich habe einen Benutzertisch und eine Freundschaftsbeitrittstabelle. Zur Vereinfachung sagen wir einfach, dass die Benutzertabelle nur einen Primärschlüssel hat. Die Freundschafts-Tabelle hat die Spalten user_id und friend_id. Die Abfrage lautet wie folgt:Sphinx-Indexer benutzerdefinierte Abfrage für sql_attr_multi

"SELECT DISTINCT friends.user_id, friends.friend_id, users.* 

    FROM FRIENDSHIPS friends, USERS 

    WHERE USERS.id = friends.friend_id AND friends.user_id = #{u.id} 

    UNION 

    SELECT DISTINCT fof.user_id, fof.friend_id, users.* 

    FROM FRIENDSHIPS friends, FRIENDSHIPS fof, USERS 

    WHERE USERS.id = fof.friend_id AND friends.friend_id = fof.user_id AND friends.user_id = #{u.id}" 

u.id die ID des Benutzers, den ich alle Freunde und Freunde von Freunden bekommen möchten.

Diese Abfrage funktioniert sehr gut, aber ich möchte dies in eine von sphinx sql_attr_multi verwendbare Abfrage konvertieren. Ich habe versucht, es direkt wie folgt zu platzieren:

aber das offensichtlich fehlgeschlagen.

Wie mache ich diese Abfrage von Sphinx-Indexer verwendbar?

Vielen Dank im Voraus für alles, was mich in die richtige Richtung zeigen wird.

Antwort

2

Ich weiß nicht genug über Ihre Datenstruktur zu sagen, dass dies 100% Arbeit, aber ich ein offensichtliches Problem sehen:

WHERE Benutzer . id = fof . friend_id AND Freunde . friend_id = fof . User_id AND Freunde . Benutzer-ID = $id

Der letzte Teil, WHERE user_id = $ ID ist falsch. Diese Syntax funktioniert, wenn Sie einem Sphinx-Index ein sql_query_info-Attribut hinzufügen, aber nicht sql_attr_multi.

Ihre Abfrage für sql_attr_multi sollte die ID als erste Spalte auswählen, die der Dokument-ID in Ihrer Haupt-sql_query entspricht.

Die zweite Spalte von sql_attr_multi ist die Spalte, die Sie im Attr zusammenfassen möchten.

+0

Danke für den Tipp, aber ich bin immer noch unsicher, wie man das macht. Das bedeutet, dass ich eine andere Abfrage erstellen muss? –

+1

Nein. Ihre Hauptabfrage zum Abrufen der Daten für den Index (sql_query) sollte eine ID auswählen. Diese ID muss mit der ersten Spalte übereinstimmen, die in Ihrer sql_attr_multi-Abfrage ausgewählt wurde. Die zweite Spalte, die Sie in Ihrer sql_attr_multi-Abfrage auswählen, ist diejenige, die Sie tatsächlich nach Werten suchen möchten. Sie verwenden nicht WHERE ID = $ ID in sql_attr_multi (die Auswahl dieser ID-Spalte erreicht das gleiche) – Jon

+0

Nach stundenlangem Versuch, das herauszufinden, bin ich immer noch an einer Straßensperre. Ich habe andere Abfragen gesehen, die Joins verwenden. Da ich kein Experte für SQL-Abfragen bin, ist es für meine Abfrage möglich, eine "Joins" -Version zu haben? –