Products
id, productName 1, Pomarańcza 2, Cebula 3, Jabłko 4, Czereśnia
ProductStatus
id, productId, STATUS, date 1, 1, 1, 2022-07-11 07:00:00 2, 1, 3, 2022-07-11 08:00:00 3, 1, 5, 2022-07-11 09:00:00 4, 3, 1, 2022-07-11 07:00:00
Statusy do produktów są przypisywane na bieżąco i potrzebuję za pomocą zapytania mysql wyświetlać listę produktów tylko tych gdzie ostatnio dodany status (ORDER BY date DESC) jest równy 1 lub produkt ten nie znajduje się w tej tabeli statusów. Dotychczas robiłem to na zasadzie wyświetlania wszystkich produktów w pętli (prawie jak poniżej) lecz potrzebuję to zoptymalizować do jednego zapytania. Czy jest to możliwe?
$queryProduct = mysqli_query($db, "SELECT * FROM Products"); while ($queryProductR = mysqli_fetch_array($queryProduct)) { $productStatus = false; $queryStatus = mysqli_query($db, "SELECT * FROM ProductStatus WHERE productId=".$queryProductR[id]." ORDER BY date DESC LIMIT 1"); $queryStatusR = mysqli_fetch_array($queryStatus); if($queryStatusR[status]==1) { $productStatus = true; } else if($queryStatusR[status]==null){ $productStatus = true; } else { $productStatus = false; } if($productStatus) { // wyświetlenie produktu } }
Problem rozwiązany

SELECT * FROM Products LEFT JOIN (SELECT * FROM ProductStatus WHERE STATUS=1 GROUP BY date DESC) AS ProductStatusB ON Products.id=ProductStatusB.productId GROUP BY Products.id