2016-12-03 5 views
1

Ich habe eine Tabelle, die als service folgt aussieht:Kombination einfache Abfragen in MySQL

id | service   | status | multicall | date_created   | 
-------------------------------------------------------------------- 
10 | Cleaning   | 1 |  0 | 2016-09-20 19:11:01 |  
11 | Gardening   | 1 |  0 | 2016-09-20 19:12:07 | 
12 | Dishes   | 1 |  1 | 2016-09-20 19:14:28 |  
13 | Take out rubbish | 1 |  1 | 2016-09-20 19:14:28 |  

Dies ist eine eine Tabelle, die Benutzer auswählen können, aus dem Dienst können, dass sie wollen, dass jemand zu tun. Sobald der Dienst beendet ist, wird die Benutzer Geschichte in einer anderen Tabelle gespeichert user_service_hist:

id | user_id | service_id | date_created   | 
-------------------------------------------------- 
1 | 1 |  10  | 2016-11-25 10:49:05 
2 | 1 |  11  | 2016-11-27 23:58:46 
3 | 1 |  12  | 2016-11-28 00:01:36 
4 | 1 |  13  | 2016-11-28 12:07:17 

Der Benutzer kann nur jeden Dienst auswählen, wenn außer der Service mit einem multicall column Wert von 1 markiert.

Als ich die Liste der verfügbaren Service rufen verwende ich die follwing Abfrage:

SELECT s.id, s.service, s.date 
from service s WHERE not exists (Select 1 from user_service_hist ush  
where ush.service_id = s.id AND ush.user_id = 1) 

Diese Abfrage wählt Nullzeilen, wie ich der Benutzer alle Dienste abgeschlossen hat. Ich möchte Service Nr. Anzeigen. 12 und 13 immer, da diese einen multiplizierten Spaltenwert von 1 haben, unabhängig davon, ob sie abgeschlossen wurde oder nicht. Kann mir jemand sagen, wie ich meine Anfrage ändern soll?

+1

Wäre das nicht ein einfaches „OR s.multicall = 1“ genügen? – hank

+0

@Stefan Ich denke, Hank hat Recht. ist nicht? –

Antwort

1

Sie die Abfrage mit einer Vereinigung kombinieren könnte für Mehrfachrufs

SELECT s.id, s.service, s.date 
    from service s WHERE not exists (Select 1 from user_service_hist ush  
    where ush.service_id = s.id AND ush.user_id = 1) 
    union 
    SELECT s.id, s.service, s.date 
    from service s WHERE multicall = 1 
0

Sie haben zwei Bedingungen für die verfügbaren Dienste:

  • Der Benutzer den Service bisher nicht genutzt hat.
  • Der Dienst ist Multi-Call.

Sie müssen nur beide in die Abfrage einschließen. Der zweite geht in die where Klausel als zusätzliche Bedingung:

select s.* 
from service s 
where not exists (Select 1 
        from user_service_hist ush  
        where ush.service_id = s.id and ush.user_id = 1 
       ) or 
     s.multicall = 1; 
+0

Hallo ich denke das sollte funktionieren. Leider habe ich andere Bedingungen in meiner ersten WHERE-Klausel. Ich habe diese nicht erwähnt, um die Abfrage zu vereinfachen. Wenn ich versuche, die neue Abfrage mit der OR-Klausel am Ende auszuführen, läuft mein Server in eine infinite Schleife und sagt "Laden ...." in phpMyAdmin – Stefan