Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Złożony SELECT
Forum PHP.pl > Forum > Bazy danych > MySQL
parzol
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!
dymsza
udostępni bazę gdzieś to jak będę miał chwile to ci napisze to zapytanie na sucho jest mi ciężko.
Method
wrzuc creaty tabelek i napisz dokladnie co chcesz uzyskac. to nie jest select z typu select * from dual smile.gif
parzol
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ę.
szopen
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.
parzol
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.
szopen
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...
parzol
Dzięki! Jesteś pierwszym któremu się udało, a dałem ten temat na wielu forach smile.gif

Pełen respekt mistrzu party.gif
szopen
Podać numer konta? ;P
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.