Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nie radze sobie z zapytaniem
Vengeance
post
Post #1





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


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
Go to the top of the page
+Quote Post
SongoQ
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Moze byc wersja z podzapytaniem?
Go to the top of the page
+Quote Post
Vengeance
post
Post #3





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


Hmm, to mysql 4 więc raczej tak :]
Go to the top of the page
+Quote Post
popbart
post
Post #4





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

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


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
Go to the top of the page
+Quote Post
SongoQ
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


@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


Ten post edytował SongoQ 15.06.2005, 20:49:35
Go to the top of the page
+Quote Post
popbart
post
Post #6





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

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


@SongoQ masz rację (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ale czasami może lepiej dać pomysł niż rozwiązanie (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
SongoQ
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


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.
Go to the top of the page
+Quote Post
Vengeance
post
Post #8





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


Wielkie dzięki chłopaki! Jesteście super :]
Dziś to przeanalizuje i postaram się wdrożyć w aplikację.
Poinformuje o efektach
Go to the top of the page
+Quote Post
popbart
post
Post #9





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

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


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.
Go to the top of the page
+Quote Post
SongoQ
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


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.

Ten post edytował SongoQ 17.06.2005, 13:09:09
Go to the top of the page
+Quote Post
popbart
post
Post #11





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
SongoQ
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


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.
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: 3.10.2025 - 01:25