2017-05-04 3 views
0

für ein paar Stunden habe ich an diesem Problem gearbeitet.MySQL existiert nicht unbekannt Spaltenfehler

Ich habe eine Tabelle in MySQL person_state

---------- 
person_state 
---------------------------- 
id | person_id | state | date 
---------------------------- 

Ich brauche aktive Personen letzte Aktivierungsdaten, Der Zustand eines jeden Menschen oft geändert (Staaten erhalten genannt wurde: aktiv, passiv, warten, blockiert). Wenn eine Person aktiviert und dann deaktiviert ist, sollte meine Abfrage sie nicht bekommen.

Meine Frage ist

select id as activation_id, person_id as active_person_id 
    from person_state 
    where state = 'active' 
    and 
    not exists(
     select * from person_state 
     where person_id = active_person_id 
     and 
     id > activation_id 
    ) 

ich Störung erhalte Unknown column 'active_person_id' in 'where clause'.

Vielen Dank für Ihre Zeit

+0

Verwenden Sie Tabellenaliasnamen. – jarlh

+0

Ich denke, dass Sie die falsche SQL zur Datenbank fragen, ich denke, Sie brauchen etwas mehr wie 'GROUP BY person_id HAVING SUM (Zustand = 'aktiv') = 1 UND SUM (state = 'passiv') = 0 '... Aber Iam nicht sicher und kann es ohne Beispieldaten und erwartete Ausgabe –

Antwort

1

WHERE vor SELECT und somit ausgeführt wird, können Sie keine Spalte Aliase im Inneren verwenden, versuchen Sie stattdessen mit Spaltennamen, zB:

select id as activation_id, person_id as active_person_id 
    from person_state ps 
    where state = 'active' 
    and 
    not exists(
     select id from person_state 
     where person_id = ps.person_id 
     and 
     id > ps.activation_id 
    ) 
+0

@Ali insan nicht testen - nicht verwenden * in der Auswahl. Sie können ** SELECT 1 ** verwenden, das ist viel schneller –

1


Sie verwenden können unter Abfrage

select P.id as activation_id, P.person_id as active_person_id 
    from person_state P 
    where state = 'active' 
    and 
    not exists(
     select 1 from person_state 
     where person_id = P.active_person_id 
     and 
     id > P.activation_id 
    ); 

Sie haben verpasst, Alias ​​bereitzustellen. Sie können entweder 1 oder * eingeben, um das Datum auszuwählen. Aber 1 arbeitet schneller als es existiert überprüft und danach suchen nur für eine Spalte

1

Jedes Mal, wenn Sie mehr als eine Spalte in einer Tabelle haben, sollten Sie qualifizierte Spaltennamen verwenden:

select ps.id as activation_id, ps.person_id as active_person_id 
from person_state ps 
where ps.state = 'active' and 
     not exists (select * 
        from person_state ps2 
        where ps2.person_id = ps.person_id and 
         ps2.id > ps.id 
       ) ; 

Ihr Hauptproblem ist, dass Sie können die Spaltenaliase in der Unterabfrage nicht verwenden.