2017-02-04 7 views
0

Ich habe eine große Select-Anweisung, die herausfinden, was ein Kontakt der aktuelle Gerät links und rechts ist. Es funktioniert gut. Die große Auswahl gibt auch die contact_id der Person zurück. MySQL JOIN: Wie zu

Hier ist sie ...

SELECT locations.name AS location_name, CONCAT_WS(' ', contacts.first_name, contacts.last_name) AS contact_name, contacts.street_1, contacts.street_2, contacts.city, contacts.state, contacts.zip, contacts.home_phone, contacts.cell_phone, contacts.email, sel.side, delivery_date AS delivered_date, CONCAT_WS(': ', makes.name, models.name) AS details, sel.serial_number, contacts.warranty_expiration_email, contacts.warranty_expiration_letter, contacts.upgrade_letter, contacts.email_newsletter, contacts.mail_newsletter 
FROM 

(SELECT 'Left Device' AS side, left_sn AS serial_number, contact_id, left_make_id AS make_id, left_model_id AS model_id, MAX(left_delivery_date) AS delivery_date 
FROM 
invoice_hearing_aids 
WHERE left_delivery_date IS NOT NULL AND left_return_date IS NULL AND trial_complete = 'Y' AND left_price IS NOT NULL AND company_id = '1' AND left_delivery_date = (SELECT MAX(t2.left_delivery_date)FROM invoice_hearing_aids t2 WHERE t2.contact_id = invoice_hearing_aids.contact_id) 
GROUP BY contact_id 

UNION 

SELECT 'Right Device' AS side, right_sn AS serial_number, contact_id, right_make_id AS make_id, right_model_id AS model_id, MAX(right_delivery_date) AS delivery_date 
FROM 
invoice_hearing_aids 
WHERE right_delivery_date IS NOT NULL AND right_return_date IS NULL AND trial_complete = 'Y' AND right_price IS NOT NULL AND company_id = '1' AND right_delivery_date = (SELECT MAX(t2.right_delivery_date)FROM invoice_hearing_aids t2 WHERE t2.contact_id = invoice_hearing_aids.contact_id) 
GROUP BY contact_id 
) sel 

LEFT JOIN hearing_aid_models models ON models.id = sel.model_id 
LEFT JOIN hearing_aid_makes makes ON makes.id = sel.make_id 
LEFT JOIN contacts ON contacts.id = sel.contact_id 
LEFT JOIN locations ON locations.id = contacts.location_id 

Ich möchte eine Reihe von Informationen hinzuzufügen. Ich möchte eine Spalte mit dem Datum des letzten Termins des Kontakts zurückgeben.

Die Termintabelle hat start_date und eine Spalte namens post_appt_status_id. Ich möchte den MAX (start_date) WHERE post_appt_status_id IN (6,7) zurückgeben.

Wenn es keinen Termin in der Tabelle Termine gibt, geben Sie einfach NULL zurück.

Ich habe versucht, dieses Ende mit dem Zusatz:

LEFT JOIN appointments appt ON appt.contact_id = sel.contact_id 
WHERE appt.post_appt_status_id IN (6,7) 

und ich added dies zu Anfang an der Spitze SELECT:

MAX(appt.start_date) 

Aber es wird alle Datensätze nicht zurück. In der Tat, ich bekomme nur 1 Zeile und ich sollte 1972 Zeilen bekommen, was ich habe, bevor ich meine Appts JOIN hinzugefügt habe.

Antwort

0

Ich denke, das passiert, weil Sie eine Aggregatfunktion (MAX) hinzugefügt, aber die Gruppierung nicht angegeben haben. Normalerweise sollte das nur einen Fehler auslösen.

Versuchen Sie, eine GROUP BY sel.contact_id bis zum Ende hinzufügen und sehen, was das Netze Sie.

+0

Danke. Das habe ich gerade versucht. Ich bekomme nur 920 Datensätze. –

+0

Ist es nicht der Punkt, es auf den letzten Termin zu reduzieren? Ich nehme an, viele dieser contact_id Zeilen sind für mehrere Termine, oder? – natecornell