Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Klauzula WHERE
Forum PHP.pl > Forum > Bazy danych > MySQL
parzol
  1. SELECT
  2. r.id AS room_id,
  3. r.name AS room_name,
  4. r.description AS opis,
  5. r.bedroom_number AS l_sypialni,
  6. r.room_number AS l_pokoi,
  7. r.is_apartment AS apartament,
  8. p.id AS property_id,
  9. p.name AS property_name,
  10. p.standard,c.name AS city,
  11. re.name AS region,
  12. rg.file,
  13. MIN(rp.price) AS min_price,
  14. MAX(rp.price) AS max_price,
  15. GROUP_CONCAT(DISTINCT CONCAT(a.name, '*', a.icon) ORDER BY a.name SEPARATOR '|') AS attractions,
  16. GROUP_CONCAT(DISTINCT CONCAT(t.name) ORDER BY t.name SEPARATOR '|') AS typ
  17. FROM room r
  18. LEFT JOIN property p ON r.property_id=p.id
  19. LEFT JOIN city c ON p.city_id=c.id
  20. LEFT JOIN region re ON p.region_id=re.id
  21. LEFT JOIN room_gallery rg ON rg.room_id=r.id
  22. LEFT JOIN room_price rp ON rp.room_id=r.id
  23. LEFT JOIN property_attraction pa ON p.id=pa.property_id
  24. LEFT JOIN attraction a ON pa.attraction_id=a.id AND (a.is_active=1 OR a.is_active IS NULL)
  25. LEFT JOIN room_type rt ON rt.room_id=r.id
  26. LEFT JOIN type t ON rt.type_id=t.id AND (t.is_active=1 OR t.is_active IS NULL)
  27. GROUP BY r.id ORDER BY p.is_promoted DESC LIMIT 0, 51


Powyższe zapytanie zwraca mi poprawnie odpowiednie informacje o pokojach z mojej bazy danych.

Jak zbudować poprawnie klauzulę WHERE dzięki której zobaczę tylko te pokoje które posiadają dowolne atrakcje (dla przykładu o ID=1 i ID=9)questionmark.gif

Pozdro.
dymsza
może tak przy użyciu HAVING ale nie jestem tego na 100 % pewien :

  1. SELECT
  2. r.id AS room_id,
  3. r.name AS room_name,
  4. r.description AS opis,
  5. r.bedroom_number AS l_sypialni,
  6. r.room_number AS l_pokoi,
  7. r.is_apartment AS apartament,
  8. p.id AS property_id,
  9. p.name AS property_name,
  10. p.standard,c.name AS city,
  11. re.name AS region,
  12. rg.file,
  13. count(a.id) AS ile,
  14. MIN(rp.price) AS min_price,
  15. MAX(rp.price) AS max_price,
  16. GROUP_CONCAT(DISTINCT CONCAT(a.name, '*', a.icon) ORDER BY a.name SEPARATOR '|') AS attractions,
  17. GROUP_CONCAT(DISTINCT CONCAT(t.name) ORDER BY t.name SEPARATOR '|') AS typ
  18. FROM room r
  19. LEFT JOIN property p ON r.property_id=p.id
  20. LEFT JOIN city c ON p.city_id=c.id
  21. LEFT JOIN region re ON p.region_id=re.id
  22. LEFT JOIN room_gallery rg ON rg.room_id=r.id
  23. LEFT JOIN room_price rp ON rp.room_id=r.id
  24. LEFT JOIN property_attraction pa ON p.id=pa.property_id
  25. LEFT JOIN attraction a ON pa.attraction_id=a.id AND (a.is_active=1 OR a.is_active IS NULL)
  26. LEFT JOIN room_type rt ON rt.room_id=r.id
  27. LEFT JOIN type t ON rt.type_id=t.id AND (t.is_active=1 OR t.is_active IS NULL)
  28.  
  29. WHERE a.ID IN (1,9) GROUP BY r.id HAVING count(a.id) = 2
  30.  
  31. ORDER BY p.is_promoted DESC LIMIT 0, 51



sprawa opiera się na tym że jeśli mam 2 atrakcje 9,1 to jeśli nie chcemy mieć żadnych innych count a.id musi być 2
parzol
sadsmiley02.gif To też nie to. Próbowałem podobnie, ale zawsze dostaje 'Empty Set'.


Może przyczyna leży w złych JOINach?

Ktoś ma jakiś pomysł?


PS. Zauważyłem że usunięcie JOINa room_price (to tabela w której w kazdym rekordzie jest pozycja z cennika, a dany pokoj moze miec takich pozycji wiele) powoduje wyswietlanie sie poprawnych wynikow! Z tabeli room_price jednak nie moge zrezygnować.

room_price(id, room_id, price)
JoShiMa
A która tabela łączy pokoje z atrakcjami? Trzeba w tym połączeni dać LEFT INNER JOIN, wtedy nie wyświetli Ci tego co nie ma atrakcji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.