2017-02-14 3 views
0

Ich habe eine Tabelle von Mitarbeitern, die alle in mehreren Abschnitten arbeiten können. Sobald jedoch ein Abschnitt für das Datum gebucht/s sind sie nicht verfügbar für dieses Datum in den anderen Abschnitten gebucht werden wirdMySQL Anfrage für die Verfügbarkeit von Mitarbeitern

Employee-Tabelle Mitarbeiter sind

id_resources id_sections EmployeeName Section 
28    25   Mark   Section Two 
28    26   Mark   Section Three 
28    28   Mark   Section Four 
28    29   Mark   Section Five 
28    53   Mark   Section Six 
28    64   Mark   Section Seven 
28    74   Mark   Section Eight 
28    76   Mark   Section Nine 
29    30   Blair   Section One 
29    47   Blair   Section Two 
29    49   Blair   Section Three 
30    82   Sam   Section One 
30    25   Sam   Section Two 
30    28   Sam   Section Three 
30    29   Sam   Section Four 
31    18   David   Section Eleven 
31    19   David   Section One 
31    22   David   Section Two 
31    25   David   Section Three 

Dann meine Buchung Tisch ist Buchungen

id_resources id_sections startdate enddate 
28     25  2016-09-09 2016-09-09 
28     26  2016-09-20 2016-09-20 
28     28  2016-10-17 2016-10-17 
30     82  2016-10-18 2016-10-18 
30     25  2016-10-28 2016-10-28 
29     30  2016-11-02 2016-11-02 
29     47  2016-11-07 2016-11-07 
29     49  2016-11-01 2016-11-01 
29     58  2017-01-09 2017-01-09 

Also das Problem ich habe, ist ein Mitarbeiter immer zu sein:

A.) nicht für alle Abschnitte verfügbar, wenn ein Abschnitt für einen Tag gebucht wird
B.) einen Mitarbeiter als verfügbar anzeigen, wenn ein Datumsbereich ausgewählt ist und für diesen Bereich keine Buchungen vorliegen.

Ich kann Teil A, aber nicht Teil B erhalten.

Select * 
FROM employees 
LEFT JOIN bookings on employees.id_resources = bookings.id_resources 
WHERE 
    (Select..... and i get lost here 

Nochmals vielen Dank für jede Hilfe!

-Lee

+0

Kann ich fragen, warum verwenden Sie id_resources anstelle von id_sections? – FreedomPride

Antwort

0

Sie sollten so etwas versuchen:

SELECT employees.* 
FROM employees 
    LEFT OUTER JOIN bookings 
    ON employees.id_resources = bookings.id_resources 
     AND (
     (startdate BETWEEN $start_range AND $end_range) 
     OR 
     (enddate BETWEEN $start_range AND $end_range) 
     ) 
WHERE bookings.id_resources IS NULL 

Schnell Erklärung: Wir verwenden LEFT OUTER JOIN ... WHERE ... als Ausschluss NULL ist. This post Sie könnten

bearbeiten helfen: Wenn Sie LEFT OUTER als Ausschluss JOIN verwenden, erste, Sie auf das Gegenteil von Ihrem Ziel zu denken. Hier wird es finden einen Benutzer, der eine Buchung zwischen zwei Daten hat. Um dies zu tun, haben Sie eine Abfrage wie diese:

SELECT employees.* 
FROM employees 
    INNER JOIN bookings 
    ON employees.id_resources = bookings.id_resources 
     AND (startdate BETWEEN $start_range AND $end_range) 
     AND (enddate BETWEEN $start_range AND $end_range) 

Dann tun Sie das Gegenteil.

Verwandte Themen