Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nie radze sobie z zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
Vengeance
Witajcie... Mam takie tabelki:

Cytat("auction")
id | typeID | siteID | minimalBid | startDate | endDate


Cytat("type")
id | name


Cytat("site")
id | name | url


Cytat("bid")
id | auctionID | userID | bid


Cytat("user")
id | username | password | email


Potrzebuje to wszystko połączyć w jedno :] Mam już taki kodzik:

  1. SELECT auction.*, type.name AS typeName, site.name AS siteName, site.url AS siteUrl
  2.  
  3. FROM auction INNER JOIN type ON auction.typeID = type.id INNER JOIN site ON auction.siteID = site.id
  4. WHERE auction.endDate > UNIX_TIMESTAMP()
  5. ORDER BY auction.endDate ASC


Potrzebuje jeszcze do każdego wyniku dołączyć najwyższą kwotę jaką ktoś zalicytował, coś ala:
  1. SELECT bid.bid, user.username
  2.  
  3. FROM bid INNER JOIN user ON bid.userID = user.id
  4. WHERE bid.auctionID = $id
  5. ORDER BY bid.bid DESC LIMIT 1


Jak to wszystko złączyć w jedno zapytanie.

Jakby ktoś nie wiedział to opisze jeszcze słownie co to ma robić:
Cytat
Chodzi o pobranie wszystkich aukcji z tabeli Auction i przyporzadkowanie numerom ID z kolumn TypeID i SiteID odpowiednich wartości (nazw). Zapytanie ma także dołączać do wyniku maksymalnie zalicytowaną kwotę (i kto dokonał licytacji) a w razie braku ofert zwróci wartość kolumny MinimalBid z tabeli Auction.


Z góry dziękuje! Jak ktos mi pomoże będę po stokroć wdzięczny.
ps. możecie także zaproponować jakieś inne logiczne rozdzielenie budowy tabel.

---
proszę używać tagu [ sql ] do oznaczania zapytań SQL
aleksander
SongoQ
Moze byc wersja z podzapytaniem?
Vengeance
Hmm, to mysql 4 więc raczej tak :]
popbart
Nie mam teraz za bardzo czasu ale podpowiem ci jak to zrobić
  1. SELECT auction.*,<span style="font-weight: bold;">temp.max_kwota, type.name AS typeName, site.name AS siteName, site.url AS siteUrl
  2. FROM <span style="font-weight: bold;">(tu
  3. musi BYć podzapytanie które zwróci id_auction i maksymalną kwotę dla tej aukcji) <span style="font-weight: bold;">as temp INNER JOIN <span style ="font-weight: bold;">auction ON temp.id_auction=auction.id_auction
  4. INNER JOIN type ON auction.typeID = type.id INNER JOIN site ON auction.siteID = site.id
  5. WHERE auction.endDate > UNIX_TIMESTAMP()
  6. ORDER BY auction.endDate ASC
SongoQ
@popbart wszystko ladnie pieknie tylko problem taki widze ze w podzapytaniu trzeba zwrocic tez id usera, bo taki byl cel autora.

Dla samej kwoty to cos takiego:
  1. SELECT auction.*,temp.max_kwota, type.name AS typeName, site.name AS siteName, site.url AS siteUrl
  2. FROM (SELECT max(bid.bid) AS max_kwota, bid.id_auction
  3. FROM bid GROUP BY bid.id_auction) AS temp INNER JOIN auction ON temp.id_auction=auction.id_auction INNER JOIN type ON auction.typeID = type.id INNER JOIN site ON auction.siteID = site.id WHERE auction.endDate > UNIX_TIMESTAMP() ORDER BY auction.endDate ASC
popbart
@SongoQ masz rację smile.gif ale czasami może lepiej dać pomysł niż rozwiązanie winksmiley.jpg
Samo podzapytanie będzie wyglądało tak:
  1. SELECT bid.bid,bid.auctionID, user.username
  2. FROM bid INNER JOIN user ON bid.userID = user.id
  3. WHERE bid.userid IN(SELECT max(bid.userid) form bid GROUP BY bid.auctionID)

A razem:
  1. SELECT auction.*,temp.username,temp.max_kwota, type.name AS typeName, site.name AS siteName, site.url AS siteUrl
  2. FROM (SELECT bid.bid,bid.auctionID, user.username
  3. FROM bid INNER JOIN user ON bid.userID = user.id
  4. WHERE bid.userid IN(SELECT max(bid.userid) form bid GROUP BY bid.auctionID)) AS temp LEFT JOIN auction ON temp.id_auction=auction.id_auction
  5. INNER JOIN type ON auction.typeID = type.id INNER JOIN site ON auction.siteID = site.id
  6. WHERE auction.endDate > UNIX_TIMESTAMP()
  7. ORDER BY auction.endDate ASC
SongoQ
Cytat
@SongoQ masz rację  ale czasami może lepiej dać pomysł niż rozwiązanie

Zgadzam sie, bo wsumie tak naprawde powinnismy sie naprowadzac na rozwiazania a nie dawac gotowe rozwiazania. I tak odpowiadajac na forum malo kto sprawdza dzialanie, ale liczy sie jakas koncepcja.

Patrze na to Twoje zapytanie i mozna by jeszcze zoptymalizowac i pozbyc sie IN to by troszeczke przyspieszylo, ale ogolnie chyba jest wszystko ok.
Vengeance
Wielkie dzięki chłopaki! Jesteście super :]
Dziś to przeanalizuje i postaram się wdrożyć w aplikację.
Poinformuje o efektach
popbart
Trochę się pomyliłem w podzapytaniu. Ten IN powinien wskazywać ostatnią licytację dla danej aukcji czyli powinno być tak:
  1. SELECT bid.bid,bid.auctionID, user.username
  2. FROM bid INNER JOIN user ON bid.userID = user.id
  3. WHERE bid.id IN(SELECT max(bid.id) form bid GROUP BY bid.auctionID)

@SongoQ a jakbyś zastąpił to in?
Pzdr.
SongoQ
Ogolnie IN mozna zastapic dodajac podzapytanie do FROM, ale nie zastanawialem sie czy tutaj rezultat bedzie taki sam. Kwestia kombinowania, ale tak na sucho trudno sie pisze.

A wracajac do wydajnosci IN to dopadlem ksiazeczke ORACLE nie pamietam juz jakiego autora i wlasne tam opisywal zeby sie wystrzegac operacji IN. Bylo to tez podane na przykadzie jakiejs firmy. Jesli Cie to interesuje to moge Ci namiary podac. W ogole tematyka dostrajania zapytan jest bardzo fascynujaca.
popbart
Cytat
A wracajac do wydajnosci IN to dopadlem ksiazeczke ORACLE nie pamietam juz jakiego autora i wlasne tam opisywal zeby sie wystrzegac operacji IN. Bylo to tez podane na przykadzie jakiejs firmy. Jesli Cie to interesuje to moge Ci namiary podac. W ogole tematyka dostrajania zapytan jest bardzo fascynujaca.

Chyba masz rację. Relacja powinna być szybsza niż ten IN.
Co do namiaru to jestem zainteresowany smile.gif
SongoQ
Odnosnie ksiazeczki to chyba to byla ta pozycja http://helion.pl/ksiazki/oporsq.htm malutka ksiazeczka ale jak bardzo uswiadamiajaca jak dziala baza danych. Ksiazka wsumie pisany tylko pod ta baze danych, ale wiele rzeczy mozna przeniesc na inne bazki.
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.