Cześć, mam taką sytuację.
Jest tabela: (ID, poem_id, listing, position)
Jest to tabela, która przechowuje coś w sensie listy przebojów.
ID - klucz główny
poem_id - ID utworu
listing - numer notowania
position - pozycja, na której znalazł się dany utwór w danym notowaniu.
To jest uproszczona wizja i mimo wszystko potrzebuję tych kolumn - również position(jakby ktoś chciał się czepić, że powinienem mieć ilość głosów i orderować po ilości głosów ;)).
I teraz tak. Tabela może wyglądać w taki sposób:
listing | position | poem_id
======================================
1 | 1 | 10
1 | 2 | 11
1 | 3 | 12
2 | 1 | 11
2 | 2 | 10
2 | 3 | 12
3 | 1 | 13
3 | 2 | 11
3 | 3 | 10
Proszę się nie sugerować, że position jest tak ładnie posortowane ;)
I teraz, jak widać z tabeli, utwór o id 10 w pierwszym notowaniu był na pierwszym miejscu, w drugim był na 2, a w trzecim był na 3. Utwór o ID 12 w pierwszym notowaniu był na 3 miejscu, w drugim był na 3, a w trzecim go w ogóle nie było. Itd.
Mając takie dane, chciałbym uzyskać taki widok:
listing | position | poem_id | last_listing | last_position
==================================================================================
3 | 1 | 13 | null | null
3 | 2 | 11 | 2 | 1
3 | 3 | 10 | 2 | 2
Czyli krótko mówiąc, wyniki trzeciego notowania i dodatkowo informacje, w którym ostatnim notowaniu pojawił się utwór i na którym miejscu.
I tak kombinuję z podzapytaniem z limitem, z róznymi maxami i havingami, ale nic nie daje. Mój najlepszy typ był taki(niestety nie działa):
SELECT hc.listing, hc.position, hc.poem_id, hc_last.listing AS last_listing, hc_last.position AS last_position
FROM hit_charts hc
LEFT JOIN
(
SELECT poem_id, listing, position
FROM hit_charts
WHERE listing <3
ORDER BY listing DESC
LIMIT 1
) AS hc_last ON hc_last.poem_id = hc.poem_id
WHERE hc.listing =3
ORDER BY hc.position ASC
To nie działa, bo w kolumnach last_* są zazwyczaj NULLe. Jak to ugryźć?