[mysql] GROUP BY

0

Witam,

mam tabele:

img_id,gal_id

Chciałbym pobrać 10 najnowszysch zdjęć z galerii

Robię tak:

SELECT img_id FROM tabela GROUP BY gal_id ORDER BY img_id DESC

Zapytanie to zwraca mi ostatnie 10 zdjęc z galerii jednak są to pierwsze zdjęcia w galeriach

Tzn dla

1,1
2,1
3,1
5,2
6,3
7.2

Zwraca 1,1 zamiast 3,1 <- to zdjęcie było ostanie w tej galerii

Jak można to zrobić?
//pobrać 10 najnowszych zdjęć, każde z innej galerii

0

Tłumaczysz zawile. Rozumiem, że img_id i gal_id to pola tabeli uzupełnionej danymi tak jak podałeś w przykładzie? To chcesz pobrać 10 najnowszych zdjęć (img_id) z najnowszej kategorii (gal_id), czy z podanej kategorii, czy ogólnie 10 najnowszych zdjęć, lecz każde zdjęcie z innej kategorii? Czy co chcesz?

0

No może troche zamieszałem... :/

Chce 10 najnowszych zdjęć, każde z innej kategorii

img_id,gal_id to pola tabeli z danymi
img_id pole autoincrement
gal_id nr id galerii do której dodano zdjęcie

0
SELECT max(img_id) FROM tabela GROUP BY gal_id ORDER BY img_id DESC limit 10
0

No tak to jest jak sie nie napisze wszystkiego... :) Takie zapytanie już sprawdzałem u siebie, próbowałem też z DISTINCT(gal_id) bez GROUP BY ale nic nie dało...

Powyższe zapytanie działa dla tej tabeli... jednak ja mam jeszcze
img_id,gal_id, filename, date, title

Więc zapytanie zwaraca img_id poprawne (ostatnie) jednak filename,title, date zwraca złe (nie ostatnio dodane a pierwsze)

Może jakiś inny pomysł?

0

Nie widzę żadnego problemu:

SELECT max(img_id), max(filename), max(date), max(title) FROM tabela GROUP BY gal_id ORDER BY img_id DESC LIMIT 10;
0

filename i title nie są incrementowane...
filename jest to ciąg generowany przez random (20 znaków)
a title to nazwa obrazka (ciąg do 30 znaków) ,dlatego MAX tutaj nie pomoże :(
zwracane jest filename i title ale nie te co trzeba

0

Hm, ale co to ma do rzeczy? Przecież takie zapytanie działa ok:

SELECT max(filename), max(title) FROM tabela GROUP BY gal_id ORDER BY img_id DESC LIMIT 10

Czy możesz mnie oświecić? :)

0

Tabela z danymi:

img_id | gal_id | filename | title
987 | 34 | kjfhsafhgsdhfgsdagf.jpg | jakis plik
986 | 34 | zjsdhfhfiegfygefgyg.jpg  | nowy plik
985 | 34 | dshfbdsbfyrufyrfbry.jpg  | pliczek
984 | 256 | sdjfhsdhfdsyfgdhs.jpg | test
983 | 256 | njfdhgbfhdbgfdhbv.jpg | tmp
982 | 34 | zzzhfhfrbyfgrfrfvr.jpg | obrazek

Zwraca
987,34,zzzhfhfrbyfgrfrfvr.jpg, pliczek
zamiast
987 | 34 | kjfhsafhgsdhfgsdagf.jpg | jakis plik

// w takim przypadku faktycznie, ale przecież mówiłeś, że img_id jest autoincrement, więc generalnie powinieneś mieć rekordy w odwrotnej kolejności - Cold

tutaj podałem ostatnie 5 rekordów z bazy

0
SELECT max(filename), max(title) FROM tabela GROUP BY gal_id ORDER BY img_id DESC LIMIT 10

Coldpeer - to nie będzie działało dobrze, bo bierzesz różne kolumny z różnych rekordów.
max(filename) może dotyczyć innego rekordu niż max(title). Zresztą w tym zastosowaniu to wyrażenie w ogóle nie ma sensu.

// mhm, dla takiego zestawu jak podał wyżej autor to wiem, nawet dałem dopisek ;) Co nie zmienia faktu, że nie jest to elegancko- Cold

Proponuje coś takiego:

SELECT * FROM tabela t1 WHERE img_id IN (SELECT img_id FROM tabela t2 WHERE t1.gal_id = t2.gal_id ORDER BY t2.img_id DESC LIMIT 10);

W ORDER_BY możesz sobie wstawić oczywiście jakąś datę albo co.
To zwraca maksimum po 10 najnowszysch zdjęć z każdej galerii.

Natomiast jeśli chcesz po 1 najnowszym zdjęciu z 10 galerii, to wtedy:

SELECT * FROM tabela t1 WHERE img_id IN (SELECT img_id FROM tabela t2 WHERE t1.gal_id = t2.gal_id ORDER BY t2.img_id DESC LIMIT 1) LIMIT 10;

Disklejmer: Nie wiem jak MySQL, ale są RDBMSy, które nie pozwolą na LIMIT i ORDER BY w podzapytaniu, bo nie da się tego z automatu zamienić na klasyczny JOIN. No cóż, musisz sprawdzić. Bardzo prawdopodobne, że to zapytanie będzie się wykonywało dosyć wolno.

0

SELECT * FROM tabela t1 WHERE img_id IN (SELECT img_id FROM tabela t2 WHERE t1.gal_id = t2.gal_id ORDER BY t2.img_id DESC LIMIT 1) LIMIT 10;

Wszystko byłoby dobrze gdybym miał wersję > 4.1 Niestety mam 4.0 bez możliwości upgrad'a i podzapytania w tej wersji nie działają.

Jedynym sensownym rozwiązaniem wydaje misie zrobienie 2 zapytan, w tym pierwsze tworzące tabelę tymczasową.

1 użytkowników online, w tym zalogowanych: 0, gości: 1