Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Klauzula WHERE
parzol
post 29.08.2008, 21:36:40
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
dymsza
post 29.08.2008, 23:10:23
Post #2





Grupa: Zarejestrowani
Postów: 62
Pomógł: 4
Dołączył: 24.08.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
parzol
post 30.08.2008, 08:16:49
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

Ostrzeżenie: (0%)
-----


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)

Ten post edytował parzol 30.08.2008, 08:47:19
Go to the top of the page
+Quote Post
JoShiMa
post 1.09.2008, 10:44:57
Post #4





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 12:17