Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Ostatnie rekordy dla danych w tabeli(po dacie)
piootras82
post 20.01.2011, 14:38:37
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 8.12.2010

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


Witam,
mam problem ponieważ nie wiem w jaki sposób stworzyć poprawne zapytanie do bazy.

Mam 3 tabele:

PUDŁA:
-----------------------------------
id_pudla .......numer_pudla
1 ........................11111
2 ........................22222
3 ........................33333
-----------------------------------

MAGAZYN
-----------------------------------
id_magazyn .....nazwa_magazynu
1 ......................mag1
2 ......................mag2
------------------------------------

HISTORIA
---------------------------------------------------------------
id_hist .......id_pudla ......data ...............id_magazyn
1 ......................1 .......2010-12-10 ...........mag1
2 ......................1 .......2010-12-11 ...........mag2
3 ......................1 .......2010-12-12 ...........mag1
4 ......................3 .......2010-12-20 ...........mag1
5 ......................2 .......2010-12-15 ...........mag1
6 ......................2 .......2010-12-16 ...........mag2
(pudło o id=1 było najpierw w mag1 -> mag2 ->mag1)

  1. SELECT numer_pudla, data, nazwa_magazynu FROM historia INNER JOIN pudla ON pudla.id_pudla = historia.id_pudla
  2. INNER JOIN magazyn ON magazyn.id_magazyn = historia.id_magazyn WHERE magazyn.id_magazyn="1"


To zapytanie zwraca mi wszystkie numery pudeł, dla których numer magazynu to "1"
czyli:

numer_pudla ........data............. magazyn
11111 .............2010-12-10 ...........mag1
33333 .............2010-12-20 ...........mag1
11111 .............2010-12-12 ...........mag1
22222 .............2010-12-15............mag1

W jaki sposób zrobić zapytanie do bazy aby wyświetlić tylko listę pudeł znajdujących się w magazynie ale po ostatnim
wpisie dla danego pudła?
Czyli pudło 11111 powinno w wynikach znajdować się tylko raz i to z ostatnią datą dodania tego właśnie pudła.
Go to the top of the page
+Quote Post
Ulysess
post 20.01.2011, 15:01:35
Post #2





Grupa: Zarejestrowani
Postów: 695
Pomógł: 65
Dołączył: 27.07.2009
Skąd: Y

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


użyj funkcji DISTINCT i posortuj by data desc limit 1
Go to the top of the page
+Quote Post
piootras82
post 20.01.2011, 15:16:18
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 8.12.2010

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


  1. SELECT numer_pudla, data, nazwa_magazynu
  2. FROM historia INNER JOIN pudla ON pudla.id_pudla = historia.id_pudla
  3. INNER JOIN magazyn ON magazyn.id_magazyn = historia.id_magazyn
  4. WHERE magazyn.id_magazyn="1" AND historia.data=(SELECT DISTINCT historia.data)
  5. ORDER BY DATA DESC LIMIT 1


Po tym zapytaniu wyświetla mi tylko pudło 11111 (z ostatnią datą) ale nie wyświetla mi pozostałych pudeł znajdujących się w bazie.
Co robię źle?
Go to the top of the page
+Quote Post
Ulysess
post 20.01.2011, 15:19:56
Post #4





Grupa: Zarejestrowani
Postów: 695
Pomógł: 65
Dołączył: 27.07.2009
Skąd: Y

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


wprowadziłem Ciebie w błąd ale sam doskonale powinieneś wiedzieć.. LIMIT 1 oznacza że pobierze tylko 1 rekord

i powinienes chyba jeszcze dodać GROUP by te pole które bierzesz (przed order by to dajesz)
Go to the top of the page
+Quote Post
piootras82
post 20.01.2011, 19:09:18
Post #5





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 8.12.2010

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


  1. SELECT numer_pudla, data, nazwa_magazynu
  2. FROM historia INNER JOIN pudla ON pudla.id_pudla = historia.id_pudla
  3. INNER JOIN magazyn ON magazyn.id_magazyn = historia.id_magazyn
  4. WHERE magazyn.id_magazyn="1"
  5. GROUP by historia.data
  6. ORDER BY pudla.numer_pudla

mam takie zapytanie, ale dalej otrzymuję wszystkie numery pudeł z danego magazynu.

Ma ktoś z Was jakiś pomysł?
Albo może podpowiecie na co jeszcze zwrócić uwagę?

Ten post edytował piootras82 20.01.2011, 16:08:21
Go to the top of the page
+Quote Post
tehaha
post 20.01.2011, 19:21:08
Post #6





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


to nie takie proste, ponieważ Ty chcesz wyniki pogrupować na polu numer_pudla(czyli otrzymać tylko po jednym wyniku dla każdego numeru pudła), ale przed tym posortować wyniki datą, problem w tym, że w mysql grupowanie odbywa się przed sortowaniem

tutaj masz rozwiązanie z podzapytaniem: http://www.cafewebmaster.com/mysql-order-sort-group

najlepiej najpierw spróbuj bez tych JOIN'ów, żeby się nie pogubił

Ten post edytował tehaha 20.01.2011, 19:22:23
Go to the top of the page
+Quote Post
piootras82
post 21.01.2011, 15:52:25
Post #7





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 8.12.2010

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


Super, dzięki bardzo mi ta formuła pomogła.

Zapytanie u mnie -> bez złączenia, wygląda tak:

  1. SELECT * FROM (
  2. SELECT * FROM historia
  3. ORDER BY data DESC
  4. )
  5. AS my_table_tmp
  6. GROUP BY id_pudla
  7. ORDER BY data DESC


W wyniku mam ostatnie wpisy dla danego pudła.
Czyli wiem, gdzie aktualnie pudło się znajduje smile.gif

I gotowe zapytanie jakby ktoś kiedyś chciał

  1. SELECT * FROM
  2. (
  3. SELECT * FROM
  4. (
  5. SELECT numer_pudla, data, nazwa_magazynu FROM historia
  6. INNER JOIN pudla ON pudla.id_pudla = historia.id_pudla
  7. INNER JOIN magazyn ON magazyn.id_magazyn = historia.id_magazyn
  8. ORDER BY data DESC
  9. )
  10. AS my_table_tmp
  11. GROUP BY numer_pudla
  12. ORDER BY data DESC
  13. )
  14. AS my_table_tmp
  15. WHERE nazwa_magazynu="mag1"
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 16:01