Witam serdecznie. Potrzebuję porady w konstrukcji zapytania do bazy mysql... Mam 2 następujące tabele opisujące produkty i nadawane im statusy...


Products
  1. id, productName
  2. 1, Pomarańcza
  3. 2, Cebula
  4. 3, Jabłko
  5. 4, Czereśnia


ProductStatus
  1. id, productId, STATUS, date
  2. 1, 1, 1, 2022-07-11 07:00:00
  3. 2, 1, 3, 2022-07-11 08:00:00
  4. 3, 1, 5, 2022-07-11 09:00:00
  5. 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?


  1. $queryProduct = mysqli_query($db, "SELECT * FROM Products");
  2. while ($queryProductR = mysqli_fetch_array($queryProduct)) {
  3.  
  4. $productStatus = false;
  5.  
  6. $queryStatus = mysqli_query($db, "SELECT * FROM ProductStatus WHERE productId=".$queryProductR[id]." ORDER BY date DESC LIMIT 1");
  7. $queryStatusR = mysqli_fetch_array($queryStatus);
  8.  
  9. if($queryStatusR[status]==1) {
  10. $productStatus = true;
  11. }
  12. else if($queryStatusR[status]==null){
  13. $productStatus = true;
  14. }
  15. else {
  16. $productStatus = false;
  17. }
  18.  
  19. if($productStatus) {
  20. // wyświetlenie produktu
  21. }
  22. }




Problem rozwiązany smile.gif

  1. 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