Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak pobrać z jednej tabeli po dwa elementy każdego typu?
Forum PHP.pl > Forum > Bazy danych > MySQL
xajart
Witam. Mam skonstruowana tabele X tak że jedna kolumna zawiera indeksy do tabeli Y. I chce pobrać z tej tabeli X po dwa elementy odwołujące się do Y wg daty modyfikacji. 


Wycinek Tabeli:
id | id_y | lastdate
1 | 1 | 2009-09-09 10:10:01
2 | 3 | 2009-09-08 10:10:01
3 | 1 | 2009-09-07 10:10:01
4 | 1 | 2009-09-07 10:52:01
5 | 2 | 2009-09-08 10:20:01
6 | 2 | 2009-09-07 10:11:01
7 | 3 | 2009-09-05 10:11:01

I teraz jak skonstruować zapytanie do BD posortowaną tablicę wg 'lastdate' pobrać po dwa elementy z kolumny 'id_y'. 

Rozwiazania które przychodzą mi do głowy to:
1) pobrac całą tabelę, a potem odpowiednio na warunkach porozdzielać po te dwa elementy - co wydaje mi się trochę bezsensowne, tymbardziej kiedy kolumna 'id_y' będzie zawierała 4 identyfikatory (1,2,3,4) to tych elementów potrzebuje tylko 8, więc nie ma sensu wczytywać całej bazy kiedy wszystkich rekordów będzie z 200.
2) skonstruować 4 zapytania
Kod
"SELECT * FROM nazwa_tabeli WHERE id_y=1 ORDER BY lastdate DESC LIMIT 2"
zmieniając tylko 'id_y'. Też rozwiązanie troche bezsensowne bo po co wykonywać aż 4 zapytania?
3) skonstruować jedno zapytanie - ale jak ? (i tytaj brakuje mi wiedzy by to zrobić).Chyba udało mi się to skonstruować, jednak czy mógłby mi to ktoś potwierdzić, że będzie działać w każdym przypadku, bo z tego co sprawdząłem to jak narazie działa.


Kod
(SELECT * FROM table WHERE id_y=1 ORDER BY lastdate DESC LIMIT 2) UNION
 (SELECT * FROM   table WHERE id_y=2 ORDER BY lastdate DESC LIMIT 2) UNION
 (SELECT * FROM table WHERE id_y=3 ORDER BY lastdate DESC LIMIT 2) UNION
 (SELECT * FROM table WHERE id_y=4 ORDER BY lastdate DESC LIMIT 2)


Puki co sprawdzałem i zwróci mi 8 elementów po dwa każdego rodzaju posortowane wg daty ostatniej modyfikacji.
darko
Nie wiem czy dobrze zrozumiałem intencje, ale zrobiłbym to tak:

select * from X a, Y b where a.X.id_y=b.Y.id_y order by a.X.lastdate desc limit U,Z

gdzie Z to ilość rekordów, które chcesz pobrać (czyli 2), a U to początkowy index pobierania czyli kolejne sekwencje: 0, U+Z... itd., np. pierwsze dwa rekordy:

select * from X a, Y b where a.X.id_y=b.Y.id_y order by a.X.lastdate desc limit 0,2

kolejne dwa:

select * from X a, Y b where a.X.id_y=b.Y.id_y order by a.X.lastdate desc limit 2,2

następne dwa:

select * from X a, Y b where a.X.id_y=b.Y.id_y order by a.X.lastdate desc limit 4,2

jeszcze dalsze dwa rekordy:

select * from X a, Y b where a.X.id_y=b.Y.id_y order by a.X.lastdate desc limit 6,2
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.