Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Złożony SELECT
parzol
post
Post #1





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

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


Hej!

Mam następujące tabele:
ROOM (id, name, property_id)
ATTRACTION (id, name, icon)
ROOM_PRICE (id, room_id, date_from, date_to, price) // wiele możliwych cenników dla pojedynczego pokoju!
PROPERTY (id, name)
PROPERTY_ATTRACTION(property_id, attraction_id)

Chce wyświetlić wszystkie pokoje z dowolnymi atrakcjami (np ID=1 i ID=9) oraz wybrać cennik dla danego pokoju. Wszystko w jednym zapytaniu.

Próbowałem poniższego zapytania:

  1. SELECT r.id AS room_id, GROUP_CONCAT(DISTINCT CONCAT(a.name, '*', a.icon) ORDER BY a.name SEPARATOR '|') AS attractions, GROUP_CONCAT(DISTINCT CONCAT(rp.id, '*', rp.price) ORDER BY rp.id SEPARATOR '|') AS price_list FROM room r LEFT JOIN property p ON r.property_id=p.id LEFT JOIN property_attraction pa ON pa.property_id=p.id LEFT JOIN attraction a ON a.id=pa.attraction_id AND (a.is_active=1 OR a.is_active IS NULL) LEFT JOIN room_price rp ON rp.room_id=r.id WHERE pa.attraction_id IN(1,9) GROUP BY r.id HAVING count(pa.attraction_id)=2 ORDER BY p.is_promoted DESC LIMIT 0, 50


Ale rezulatatem jest lista błędnych pokojów (nie tych o wskazanych dwóch atrakcjach). Jak zbudować tutaj poprawne zapytanie?


Z góry dzięki za wszelką pomoc!
Go to the top of the page
+Quote Post
dymsza
post
Post #2





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

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


udostępni bazę gdzieś to jak będę miał chwile to ci napisze to zapytanie na sucho jest mi ciężko.
Go to the top of the page
+Quote Post
Method
post
Post #3





Grupa: Zarejestrowani
Postów: 177
Pomógł: 6
Dołączył: 14.01.2003
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


wrzuc creaty tabelek i napisz dokladnie co chcesz uzyskac. to nie jest select z typu select * from dual (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
parzol
post
Post #4





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

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


http://www.parzol.ovh.org/baza.sql

Uzyskać chcę złączenie tabel które są many-to-many takich jak attraction, room_price czy type. Problem stanowi tu to że jeśli występują naraz to wyniki zwracana przez zapytanie są błędne.

Na innym forum ktoś polecił mi takie coś:

  1. SELECT r.id, GROUP_CONCAT(DISTINCT CONCAT(a.name, '*', a.icon) ORDER BY a.name SEPARATOR '|') attractions,GROUP_CONCAT(DISTINCT CONCAT(rp.id, '*', rp.price) ORDER BY rp.id SEPARATOR '|') price_list FROM room r LEFT OUTER JOIN property p ON r.property_id=p.id LEFT OUTER JOIN property_attraction pa ON pa.property_id=p.id LEFT OUTER JOIN attraction a ON a.id=pa.attraction_id LEFT OUTER JOIN room_price rp ON rp.room_id=r.id WHERE (a.is_active=1 OR a.is_active IS NULL) AND pa.attraction_id IN(1,9) GROUP BY r.id HAVING count(*)>=2 ORDER BY p.is_promoted DESC LIMIT 0, 50;


Ale to też nie zwraca tego co chcę.
Go to the top of the page
+Quote Post
szopen
post
Post #5





Grupa: Zarejestrowani
Postów: 60
Pomógł: 5
Dołączył: 28.08.2008

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


Czy chcesz aby zapytanie zwróciło pokoje w których występują a) dokładnie te atrakcje które podasz (nie mniej, nie więcej), B) te atrakcje które podasz i mogą być jeszcze jakieś, c) pokoje w których jest conajmniej jedna z podanych atrakcji?

-- edit
baza jest dość mała, więc napisz jaki powinien być wg Ciebie poprawny rezultat.

Ten post edytował szopen 31.08.2008, 20:05:07
Go to the top of the page
+Quote Post
parzol
post
Post #6





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

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


Dokladnie odpowiedz "B" . Te atrakcje beda w wyszukiwarce (to jej element). Podaje jakies atrakcje (dowolna ilosc).

Tutaj przykladowo id=1 i id=9. W rezultacie mam otrzymac TYLKO pokoj o id=1. Nie moga byc zwrocone pokoje z tylko jedna atrakcja. Chodzi o TYLKO te pokoje ktore maja wszystkie podane atrakcje!! To podstawowy warunek.


Pozdrawiam.

Ten post edytował parzol 31.08.2008, 20:07:57
Go to the top of the page
+Quote Post
szopen
post
Post #7





Grupa: Zarejestrowani
Postów: 60
Pomógł: 5
Dołączył: 28.08.2008

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


Ale dokładnie co? Po edicie już wiem ; )

A to działa tak jak trzeba?
Kod
SELECT r.id AS room_id,
       GROUP_CONCAT( DISTINCT CONCAT(a.name, '*', a.icon) ORDER BY a.name SEPARATOR '|') AS attractions,
       GROUP_CONCAT(DISTINCT CONCAT(rp.id, '*', rp.price) ORDER BY rp.id SEPARATOR '|') AS price_list
  FROM room r LEFT JOIN property p             ON r.property_id=p.id
              LEFT JOIN property_attraction pa ON pa.property_id=p.id
              LEFT JOIN attraction a           ON a.id=pa.attraction_id AND (a.is_active=1 OR a.is_active IS NULL)
              LEFT JOIN room_price rp          ON rp.room_id=r.id
  WHERE pa.attraction_id IN(1,9)
  GROUP BY r.id
  HAVING count(distinct pa.attraction_id)>=2 -- albo = 2 jeśli (a)
  ORDER BY p.is_promoted DESC
  LIMIT 0, 50;


Offtop: czemu przy BBCodach [ sql ] nie zachowuje wcięć? Czy może ja coś źle robię? Byłbym wdzięczny adminom za dodanie w CSSach pre dla bloków SQLowych...

Ten post edytował szopen 31.08.2008, 20:22:19
Go to the top of the page
+Quote Post
parzol
post
Post #8





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

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


Dzięki! Jesteś pierwszym któremu się udało, a dałem ten temat na wielu forach (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pełen respekt mistrzu (IMG:http://forum.php.pl/style_emoticons/default/party.gif)
Go to the top of the page
+Quote Post
szopen
post
Post #9





Grupa: Zarejestrowani
Postów: 60
Pomógł: 5
Dołączył: 28.08.2008

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


Podać numer konta? ;P
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 14:02