2017-01-04 3 views
0

Ich habe eine Tabelle mit Status.mysql wählen Sie die Standardwerte aus der Tabelle, wenn keine benutzerspezifischen gefunden werden

ID   UserID StatusID Description 
1   0  0   ready 
2   0  1   on hold 
3   0  2   cancelled 
4   3  1   waiting 
5   3  2   deleted 
6   3  4   waiting on supplier 
7   4  5   postponed 

etc ...

UserID 0 hält meine Standard-Beschreibungen. Ich möchte den gesamten Status-Text für einen Benutzer und die Standardwerte herausziehen, wenn es keine Benutzerwerte mit der gleichen Status-ID gibt. zB Benutzer-ID 3 zurückkehren sollte

ID   UserID StatusID Description 
    1   0  0   ready 
    4   3  1   waiting 
    5   3  2   deleted 
    6   3  4   waiting on supplier 

zB Benutzer-ID 4 zurückgeben sollte

ID   UserID StatusID Description 
1   0  0   ready 
2   0  1   on hold 
3   0  2   cancelled 
7   4  5   postponed 

Benutzer-ID 7 sollte

ID   UserID StatusID Description 
1   0  0   ready 
2   0  1   on hold 
3   0  2   cancelled 

so weit ich habe diese zurück:

select description.* from status_description description 
join (
    select max(id) as maxid from (
    select * from status_description default where default.user_id = 0 
    union 
    select * from status_description userstatus where ectfsa.user_id = 67 
    ) as subset 
    group by subset.ID 
) as newest_desc on newest_desc.maxid = description.id 
order by StatusID asc; 

Wo ich Union Sowohl die Benutzerstatus als auch die Standardstatus und dann verbinden die maximale ID pro StatusID mit der ursprünglichen Tabelle, um den Benutzer und die Standardwerte abzurufen.

Das funktioniert gut, bis jemand einen neuen USERID0-Status mit einer höheren ID hinzufügt. Eg wir entscheiden, dass alle Benutzer nun die Möglichkeit von „verschoben“ haben sollte und wir eine Linie

ID   UserID StatusID Description 
8   0  5   next week 

hinzufügen, die die gleiche „Status“ als „verschoben“ sein sollte, aber unterschiedlich für alle Benutzer formuliert, in welchem ​​Benutzer-ID 4 hat .

Wenn es eine elegantere Möglichkeit gibt, dies zu tun, ohne Max zu verwenden und nur Standardwerte auszuwählen und Benutzerstatus hinzuzufügen, die Standardwerte überschreiben, wo sie bereits existieren?

Ich muss dies in mysql (dh nicht php), da es eine Verbindung zu einer anderen Abfrage sein wird, um benutzerspezifische Beschreibungen für einen anderen Bericht herauszuziehen.

Antwort

0

ich denke, das eine Lösung sein kann:

select * from (
    select StatusID,Description from status_description default where default.user_id = 0 
    union 
    select StatusID,Description from status_description userstatus where ectfsa.user_id = 67 
    ) as StatusID; 

Ich brauche nicht die Benutzer-ID in dem Ergebnis oder die ID. Indem Sie diese aus der Union entfernen, indem Sie die * durch Feldnamen ersetzen, entfernt die Union automatisch Duplikate oder erscheint zumindest so, als ob ...

Verwandte Themen