Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Ostatnie rekordy dla danych w tabeli(po dacie)
Forum PHP.pl > Forum > Przedszkole
piootras82
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.
Ulysess
użyj funkcji DISTINCT i posortuj by data desc limit 1
piootras82
  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?
Ulysess
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)
piootras82
  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ę?
tehaha
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ł
piootras82
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"
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.