У меня есть стол events
и стол invoices
каждый event
может иметь до 5 invoices
(счета имеют event_id и могут иметь только одно событие)
Каждый счет имеет два поля: «отменено» и «paperwork_received_datestamp». Мы рассматриваем «полностью завершенное событие», поскольку каждый неотменяемый счет-фактура имеет дату, введенную для этого поля. Мне нужно показать список только «полностью завершенных событий».
У меня есть этот запрос
SELECT
Event.id,
GROUP_CONCAT(Invoice.cancelled) AS "cancelled_status",
GROUP_CONCAT(IF(Invoice.paperwork_received_datestamp IS NOT NULL, "installed", "not_installed")) AS "paperwork_status"FROM
`events` `Event`
LEFT JOIN invoices Invoice ON Invoice.event_id = Event.id
WHERE
YEAR(Invoice.submit_date) = 2015
GROUP BY
Event.id
Это производит вывод, такой как
Event ID ---- cancelled_status---- paperwork_status
23562 --------no,no,no ------------installed,installed,installed (this row should show up)
21563 -------no,no,yes -------------installed,installed,not_installed (this row should show up)
24672 --------no,no ----------------installed,not_installed (this row shouldn't show up)
25784 ----------yes,yes -------------not_installed,not_installed (this row shouldn't show up)
Единственный способ, которым я могу думать, — это использовать разнесение в обоих полях group_concat в PHP и циклически проходить по каждой строке, использовать некоторую логику и исключать строки, которые я хочу исключить, для создания списка. Я бы предпочел сделать это в MySQL. Есть идеи?
Извините, ребята, я понял ответ. (Я открыт для лучших способов сделать это, хотя)
SELECT
GROUP_CONCAT(IF(Invoice.cancelled = "NO" && Invoice.paperwork_received_datestamp IS NULL, "incomplete", "complete")) AS "test"FROM
`events` `Event`
LEFT JOIN invoices Invoice ON Invoice.event_id = Event.id
WHERE
YEAR(Invoice.submit_date) = 2015
GROUP BY
Event.id
HAVING
INSTR(test, 'i') = 0 /* removes all incompletes */
Других решений пока нет …