Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL]Łączenie tabel z ograniczeniem
marrks
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 9.12.2009

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


Witam
mam w bazie 2 tabele:
"dzialki" - w której są numery wszystkich działek
"sprzedaz" - w której są zapisywane informacje o sprzedażach działek

dzialki:

|id_dz | nr_dzialki |
| 1      | 815/2 |
| 2      | 820/1 |

sprzedaz:

| id | id_dz | cena | data_sprzedazy |
| 1 |       2 |   450 | 2010-05-15 |
| 2 |       2 |  500 | 2010-08-20 |

Jeżeli działka zostaje sprzedana to w tabeli "sprzedaz" zostaje zapisywana cena i data sprzedaży,
czyli niektóre działki będą miały kilka rekordów w tabeli sprzedaż a inne wcale
Problem polega na tym że: chcę wyciągnąć informacje o wszystkich działkach ale tak żeby dla konkretnej działki
zwracało tylko informacje o ostatniej sprzedaży (cena, data) a jeżeli działka nie była sprzedawana to żeby zwróciło null.
próbowałem takiego zapytania:

  1. SELECT * FROM dzialki AS e
  2. LEFT JOIN
  3. ( SELECT CENA, DATA_SPRZEDAZY, id_dz FROM sprzedaz) AS s
  4. ON (e.id_dz = s.id_dz


ale gdy działka była sprzedawana 2 razy to wyciąga mi tą działkę 2 razy i nie wiem jak to ograniczyć żeby każdą działkę wyciągało tylko raz z informacjami z ostatniej sprzedaży.

Proszę o pomoc.

Jak coś źle to z góry przepraszam.



Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ogólnie kombinujesz w dobrą stronę. Jest to left join tabeli działek z tabelą sprzedaży, ale musisz użyć grupowania po id działki. Problemem niestety jest uzyskanie proste daty i kwoty ostatniej sprzedaży. Group by przekazuje bowiem w wyniku pierwszy pasujący do złączenia rekord, a następne olewa. Aby więc to zadziałało to powinieneś tabelę sprzedaży podać mu "odwróconą" (IMG:style_emoticons/default/smile.gif)
  1. SELECT d.*, s.CENA, s.DATA_SPRZEDAZY
  2. FROM dzialki AS d
  3. LEFT JOIN (
  4. SELECT CENA, DATA_SPRZEDAZY, id_dz
  5. FROM sprzedaz
  6. ORDER BY DATA_SPRZEDAZY DESC
  7. ) AS s
  8. ON d.id_dz = s.id_dz
  9. GROUP BY d.id_dz
Wywaliłbym niepotrzebne rzeczy z SELECTA oraz użył jakiegoś klucza PRIMARY lub jakiegokolwiek, który pozwala mi szybko odwrócić tabelę sprzedaży według kolejności od najmłodszej do najstarszej. Nie znam struktury więc użyłem tu DATA_SPRZEDAZY, choć zapewne nie masz na niej indeksu.
Go to the top of the page
+Quote Post
marrks
post
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 9.12.2009

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


Wielkie dzięki wszystko mi teraz śmiga (IMG:style_emoticons/default/yahoo.gif)
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: 22.08.2025 - 14:18