2017-01-12 4 views
0

Ich habe 3 Tabellen in der Datenbank wie dieseinnerhalb Abfrage mit Union Abfrageergebnis zurück

Tabelle availability

availability_id | date  | price | room_id | closed 
------------------------------------------------------- 
     1  | 2017-01-24 | 75 | 8  | 0 
     2  | 2017-01-24 | 95 | 9  | 0 
     3  | 2017-01-25 | 80 | 73  | 0 
     4  | 2017-01-25 | 70 | 65  | 0 
     5  | 2017-01-26 | 85 | 42  | 0 
     6  | 2017-01-26 | 65 | 21  | 0 

Tabelle offer_day

plan_id | offer_id date | price  | room_id | | closed 
------------------------------------------------------------ 
1  |  12  | 2017-01-24 | 70 | 8 | 0 
2  |  23  | 2017-01-24 | 75 | 9 | 0 
3  |  12  | 2017-01-25 | 70 | 8 | 1 
3  |  14  | 2017-01-25 | 70 | 8 | 0 
4  |  34  | 2017-01-25 | 75 | 9 | 0 
5  |  43  | 2017-01-25 | 80 | 73 | 0 
6  |  54  | 2017-01-25 | 85 | 65 | 0 
7  |  65  | 2017-01-26 | 75 | 42 | 0 
8  |  44  | 2017-01-26 | 70 | 21 | 0 

Tabelle package_day

package_id | date  | price | room_id | closed 
-------------------------------------------------- 
    1  | 2017-01-24 | 120 | 8  | 0 
    2  | 2017-01-24 | 125 | 9  | 0 
    3  | 2017-01-25 | 135 | 73  | 0 
    4  | 2017-01-25 | 130 | 65  | 0 
    5  | 2017-01-26 | 125 | 42  | 0 
    5  | 2017-01-26 | 120 | 21  | 0 

Ich habe Abfrage wie folgt:

SELECT a.price 
FROM availability a 
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) 

UNION 

SELECT 0.price 
FROM offer_day o 
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) 

UNION 

SELECT p.price 
FROM package_day p 
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) 

Wenn ich diese Abfrage ausführen, werde ich alle Zeilen erhalten, die closed = 0. Wie Sie in der Tabelle offer_day sehen können, gibt es in der Spalte closed den Wert 1.

Ich will nicht das Ergebnis zeigen, wenn Zeilen in Spalte close in derselben room_id und gleichen offer_id Wert enthalten 1.

Beispiel, Sie in der Tabelle sehen können offer_day dass room_id 8 zwei Tage, ‚2017- 01-24 'und' 2017-01-25 'und zwei offer_id 12 und 14, die in Datum' 2017-01-25 'hat 1 in closed und in 8. Ich möchte nicht zeigen, dass room_id 8 und offer_id 12 wenn überhaupt Zeilen enthalten Wert 1

Wie kann ich das tun?

Vielen Dank.

+0

Sie haben eine Bedingung -> x.closed = 0, mit dieser in Ihrer Abfrage erhalten Sie alle Datensätze, die geschlossen haben = 0 –

+0

ya ich weiß, dass. Aber ich möchte, dass in Datumsbereich, den ich eingegeben, wenn es Wert 1 in Spalte geschlossen ist, ich möchte nicht alle Datensätze anzeigen @RafaelShkembi – Antonio

+0

Was ist das Problem mit Ihrer Abfrage? Was ist die Ausgabe? Welche Ausgabe erwarten Sie? – shmosel

Antwort

0

, wenn Sie Sie Abfrage verwenden bleow können nicht genügend Platz wollen

SELECT a.price 
FROM availability a 
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and a.room_id NOT IN (select room_id FROM availability WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26') 

UNION 

SELECT o.price 
FROM offer_day o 
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and o.room_id NOT IN (select room_id FROM offer_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26') 

UNION 

SELECT p.price 
FROM package_day p 
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and p.room_id NOT IN (select room_id FROM package_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26') 

Sie sehen können, wenn geschlossen = 1 i bekommen es Zimmer-ID ist und verwenden Sie es nicht im Zimmer ID. haben Sie jetzt Ihre Ans?

+0

Ich ändere einfach column offer_id zu plan_id und füge offer_id als neue Spalte hinzu. Bitte schau nochmal in meine Fragen. – Antonio

+0

hat es funktioniert? –

+0

Ich habe Idee gegeben, jetzt können Sie neue Abfrage Ihren eigenen Weg machen –

0

Sie haben in den Kommentaren gefragt, dass, wenn ein geschlossener Datensatz 1 ist, Sie keine Datensätze aus Ihrer Tabelle aufnehmen möchten. Sie können eine Unterabfrage machen, um zu überprüfen, ob Sie irgendwelche Werte haben, die Sie nicht wollen. Hier ist ein Beispiel

SELECT a.price 
FROM availability a 
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and a.closed NOT IN (select closed FROM availability WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26') 

UNION 

SELECT o.price 
FROM offer_day o 
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and o.closed NOT IN (select closed FROM offer_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26') 

UNION 

SELECT p.price 
FROM package_day p 
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and p.closed NOT IN (select closed FROM package_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26') 
+0

kann es wird nicht funktionieren, wenn es ist irgendwelche Daten o.closed = 1 dann bring kein einziges Datenereignis o.closed = 0 anderer Wert im angegebenen Datenbereich –

+0

@krishnpatel ja ich weiß aber das OP hat gesagt, dass er alle Datensätze mit geschlossen = 0 aber nehmen will Wenn ein Datensatz mit geschlossen = 1 in der Tabelle vorhanden ist, werden keine Ergebnisse angezeigt. Ich habe den Datumsfilter in der Unterabfrage vergessen, ich werde meine Antwort –

+0

@Antonio jetzt aktualisieren, ich bekomme es. Bitte warten Sie ein paar Minuten Ich werde meine Antwort aktualisieren –