2010-11-19 9 views
2

Ich bin versucht, ein Raster der Verfügbarkeit von einer Anzahl von Tabellen zu erstellen, um Informationen zu präsentieren, wie folgt:Erstellen eines Gitters von Daten mit PHP/MySQL - Union Abfragen?

------------------------------------------------------ 
venue  | 22/11 | 23/11 | 24/11 | 25/11 | 26/11 | 
------------------------------------------------------ 
Some venue | £24 | £25 | £32 | N/A | £65 | 
------------------------------------------------------ 
Some venue | £20 | N/A | £22 | £34 | £43 | 
------------------------------------------------------- 

Für jeden Veranstaltungsort ich ein Re-Cord für das ausgewählte Datum Zeit unter Verwendung einer Abfrage erstellen können, wie:

Der Schlüssel hier ist, dass ich einen Nullwert für alle Daten, die nicht verfügbar sind, während mein Recordset auf die richtige Anzahl von Tagen (dh. 5 Einträge für eine Arbeitswoche) zurückgeben kann.

Zu jedem der Veranstaltungsorte zu dieser Liste hinzufügen Ich war einfach eine UNION-Abfrage mit Berücksichtigung der Datensätze in einer wie so kombinieren:

(SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId = 7 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate) 
UNION 
(SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId = 8 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate); 

mit diesem Meine Sorge ist, sagen mit 10 verschiedenen Orten das könnte abgefragt werden, könnte die Abfrage ziemlich lange dauern.

Also meine Frage ist wie folgt: Ist eine UNION-Abfrage meine einzige Option hier oder gibt es eine alternative JOIN, die ich verwenden kann, um sicherzustellen, dass ich eine volle Woche Ergebnisse für alle Orte, die abgefragt werden.

Hoffentlich ist klar: -S

EDIT:

Um anzuzeigen, was ich unten nach Screenshots von dem Re-Cord erforderlich und aktuelle Abfrage sind:

alt text

alt text

Verwendung von IN() wie vorgeschlagen: alt text

Antwort

2
SELECT td.query_date, a.venueId 
FROM temp_date td 
CROSS JOIN 
     (
     SELECT 7 AS id 
     UNION ALL 
     SELECT 8 AS id 
     ) ids 
LEFT JOIN 
     availability a 
ON  a.date = td.query_date 
     AND a.id = ids.id 
ORDER BY 
     ids.id, td.query_date 

Beachten Sie auch, dass GROUP BY keine richtige Methode ist hier Duplikate zu behandeln: in der Tat, Ihre Abfrage in jedem anderen System außer MySQL jammern würde, und sogar in MySQL mit ANSIGROUP BY Verhalten aktiviert.

Sind Duplikate auf (date, id) in availability möglich? Wenn ja, welches dieser Duplikate sollte ausgewählt werden?

+0

danke dafür werde ich in Kürze ein Stück haben.Und nein, (Datum, ID) Duplikate sind bei Verfügbarkeit nicht möglich. – simnom

+0

@simnom: Sie können "GROUP BY" loswerden, dann ist es überflüssig. – Quassnoi

+0

Das hat hervorragend funktioniert. Vielen Dank. – simnom

1

Warum nicht IN() verwenden?

SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId IN(7, 8) 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate 
+0

Hallo, bin auf dieser Straße, mit IN() werde ich nur sagen, 5 Zeilen, während ich 10 Zeilen eine "Woche" für jeden Veranstaltungsort wollen. – simnom

+0

Ich habe die ursprüngliche Frage geändert, um anzuzeigen, was ich genauer meine. – simnom

0

Ja, definitiv, wie Webnet beschreiben Sie können IN-Anweisung für die Auswahl Ihrer LocationID verwenden.

SELECT temp_date.queryDate, availability.venueId 

FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId IN(7, 8) 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate 
+0

Als Kommentar zur Antwort von @webnet liefert dies nicht das gewünschte Ergebnis mit nur einem Eintrag für jeden Eintrag in temp_date. Was ich benötige, ist ein Ort/Datum für jede Kombination aus Ort und Datum. d. h. 5 Einträge für einen Veranstaltungsort/Woche, 10 Einträge für zwei Veranstaltungsorte/Woche. – simnom

+0

Ich habe die ursprüngliche Frage geändert, um anzuzeigen, was ich genauer meine. – simnom

Verwandte Themen