LEFT JOIN z LIMITEM

0

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źć?

0

OK, chyba mi się udało ogarnąć, ale myślę, że można to zrobić jakoś prościej:

select c.listing, c.position, c.poem_id, c.last_listing, hc_last.position as last_position
from
(
	SELECT listing, position, poem_id, max( a.last_listing ) AS last_listing
	FROM 
	(
		SELECT hc.listing, hc.position, hc.poem_id, hc_last.listing AS last_listing
		FROM hit_charts hc
		LEFT JOIN phpbb_users u ON u.user_id = p.uid
		LEFT JOIN hit_charts hc_last ON hc_last.poem_id = hc.poem_id
		AND hc_last.listing <3
		WHERE hc.listing =3
	) AS a
	GROUP BY listing, position, poem_id
) as c
LEFT JOIN hit_charts as hc_last ON hc_last.poem_id = c.poem_id and hc_last.listing = c.last_listing
ORDER BY c.position

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