2016-08-09 14 views
0
beitreten hat

ich eine Unterabfrage mit Hilfe einer Tabelle filtern, aber es schließt sich eine weitere Tabelle, deren Werte ich brauche auch:Namenskollision, wenn MySQL Unterabfragen verwenden, die eine

SELECT * FROM properties 
JOIN (
    SELECT persons.*, cities.* FROM persons 
    JOIN properties.* ON properties.person_id = persons.id 
    AND (properties.value = 1 OR properties.value = 2) 
    JOIN cities ON cities.id = persons.city_id 
    GROUP BY persons.id 
    HAVING COUNT(DISTINCT properties.id) = 2 
) filtered_persons ON filtered_persons.id = properties.person_id 

Diese Auseinandersetzungen wegen persons.id und cities.id beim Benennen der Unterabfrage filtered_persons. Die Unterabfrage kommt eigentlich von einem Funktionsaufruf in PHP-Code, sonst würde ich einfach später an cities teilnehmen.

Das Ergebnis ist eine Liste aller Eigenschaften dieser Personen, für die bestimmte Eigenschaften festgelegt sind.

Die resultierende Abfrage sollte properties.*, persons.* und cities.* haben, da es später verwendet wird, um es weiter zu filtern.

Wie kann ich die Namenskollision vermeiden, ohne die Unterabfrage zu ändern? Ist es überhaupt möglich?

+1

Sie sollten 'select *' nicht mit 'group by' verwenden, daher stimmt etwas mit der Logik Ihrer Abfrage nicht. –

+1

Es scheint, dass 'filtered_persons.id' mehrdeutig ist, weil sie von Personen oder Städten kommen könnte. Du musst das lösen. –

+1

Erweiterung auf was @GordonLinoff sagte; Die Verwendung von 'SELECT persons. *' Mit 'GROUP BY persons.id' sollte in Ordnung sein. Es gibt mir manchmal den Schauer, aber das wird explizit von MySQL unterstützt - vorausgesetzt, dass 'persons.id' ein eindeutiger Bezeichner ist. Probleme treten jedoch auf, wenn Sie auch 'cities. *' Zu diesem 'SELECT' hinzufügen; Wenn der Personendatensatz mehreren Städten zugeordnet ist, wird nur eine Stadt zurückgegeben. Aber die, die du bekommst, wird völlig willkürlich sein. – MatBailie

Antwort

0

Sie müssen einen Alias ​​und einen entsprechenden Alias ​​erstellen, um Bedingungen festzulegen. wie SELECT * FROM Benutzer als userTable INNER JOIN Clients als Client ON userTable.id = clients.id;

0

Ihr Code wird gut funktionieren, sollten Sie Aliase für Städte, Personen Tabelle verwenden. Da Ihre (ID) Spalten mehrdeutig sind. Die Spalten persons.id und cities.id haben denselben Spaltennamen für die ID. Es gibt zwei Tabellen Personen und Städte Tabelle, die den gleichen Namen Spalte der ID haben. Verwenden Sie daher einen Alias ​​für den Spaltennamen, um den Wert zu erhalten.

SELECT * FROM properties 
JOIN (
    SELECT p.id as personid , c.id as id FROM persons as p 
    JOIN properties as properties ON properties.person_id = p.id 
    AND (properties.value = 1 OR properties.value = 2) 
    JOIN cities as c ON c.id = p.city_id 
    GROUP BY p.id 
    HAVING COUNT(DISTINCT properties.id) = 2 
) filtered_persons ON filtered_persons.id = properties.person_id 
Verwandte Themen