/ / Left dołącza ostatnią datę inspekcji do zakładów używających MySQL - mysql, sql

Po lewej stronie dołącz najnowszą datę inspekcji do zakładów używających MySQL - mysql, sql

Mam tabelę zakładów i chcę zwrócić zestaw wyników z najnowszą datą kontroli z tabeli kontroli. W tej chwili mam:

SELECT business_table.business_name, business_table.address, inspection_table.date
FROM business_table
LEFT JOIN inspection_table ON business_table.id = inspection_table.business_id
WHERE inspection_table.date = (
SELECT MAX(date)
FROM inspection_table)

Problemem jest to, że otrzymuję tylko jeden wynik zdata ostatniej kontroli. Potrzebuję zwrotu wszystkich lokali. Zapytanie będzie musiało być wydajne, ponieważ mam około 600 000 placówek i 3 miliony inspekcji.

Odpowiedzi:

0 dla odpowiedzi № 1

Ach, wcale nie szukasz ostatniej daty kontroli. Szukasz ostatniej daty kontroli na firmę.

W swoim rozwiązaniu nadal używasz złączenia zewnętrznego, które nie działa. Nie rób tego. Albo użyj sprzężenia zewnętrznego i używaj go prawidłowo, albo użyj sprzężenia wewnętrznego, jeśli wszystko jest w porządku.

Oto jak uzyskać najnowszą inspekcję dla każdej firmy z zewnętrznym złączeniem (abyś pokazał również firmy, które jeszcze nie zostały poddane inspekcji):

SELECT
b.business_name,
b.address,
i.date,
...
FROM business_table b
LEFT JOIN inspection_table i
ON  i.business_id = b.id
AND (i.business_id, i.date) IN
(
SELECT business_id, MAX(date)
FROM inspection_table
GROUP BY business_id
);

To samo z łączeniami:

SELECT
b.business_name,
b.address,
i.date,
...
FROM business_table b
LEFT JOIN
(
SELECT business_id, MAX(date) AS date
FROM inspection_table
GROUP BY business_id
) latest ON latest.business_id = b.id
LEFT JOIN inspection_table i
ON  i.business_id = latest.business_id
AND i.date        = latest.date;

1 dla odpowiedzi nr 2

Używasz sprzężenia zewnętrznego. Jeśli rekord biznesowy nie ma pasującego rekordu kontroli, wówczas zamiast niego tworzony jest pusty rekord kontroli. Tak, aby dołączony zewnętrznie rekord inspekcji miał wszystkie kolumny NULL. Więc masz WHERE inspection_table.date = (...). Powoduje to ponowne odrzucenie wszystkich dołączonych zewnętrznie rekordów, ponieważ NULL nigdy nie będzie pasować.

Posługiwać się AND zamiast tego, aby warunek stał się częścią WHERE klauzula:

SELECT
b.business_name,
b.address,
i.date
FROM business_table b
LEFT JOIN inspection_table i
ON  i.business_id = b.id
AND i.date        = (SELECT MAX(date) FROM inspection_table);

0 dla odpowiedzi № 3

Skończyłem z następującymi:

SELECT business_table.business_name AS Name, business_table.address AS Address, business_table.city AS City, business_table.state AS Province, inspection_table.rating AS Rating, inspection_table.date AS "Inspected"
FROM business_table
LEFT JOIN inspection_table ON business_table.id = inspection_table.business_id
WHERE inspection_table.date = (
SELECT MAX(inspection_table.date)
FROM inspection_table
WHERE business_table.id = inspection_table.business_id)
ORDER BY inspection_table.date DESC