Zadanie tego zapytania to wyciagnac z tabeli 10 najnowszych rekordow ale tylko jeden dla urzytkownika.
Jest to tabela z shout boxem, urzytkownicy wpisuja nowe wiadomosci a ja chcialbym pokazac 10 tych najnowszych.
Dotychczas realizowalem to takim o to zapytaniem:
SELECT m.*, c.name AS categoryName, me.profilenam, p.private_number FROM shout_messages m INNER JOIN shout_categories c ON (m.category = c.cat_id) INNER JOIN members me ON (me.mem_id = m.mem_id) INNER JOIN profiles p ON(p.mem_id = m.mem_id) WHERE m.created IN( SELECT MAX(created) FROM shout_messages GROUP BY mem_id)
Ktore w uporoszczonej postaci wyglada tak:
SELECT * FROM shouts WHERE created IN(SELECT MAX(created) FROM shouts GROUP BY mem_id)
Problem pojawil sie gdy przybylo rekordow, jako ze nie moge zastosowac limitu w podzapytaniu to to query ssie mi baze az milo.
Kolejnym rozwiazaniem bylo wygooglowane:
SELECT m.*, c.name AS categoryName, me.profilenam, p.private_number, me.gender, SUBSTRING( MAX( CONCAT(LPAD(m.created,10,\'0'),shout) ), 10+1) AS shout, MAX(m.created) as created FROM shout_messages m INNER JOIN shout_categories c ON (m.category = c.cat_id) INNER JOIN members me ON (me.mem_id = m.mem_id) INNER JOIN profiles p ON(p.mem_id = m.mem_id) AND me.mobile_verified = 1 AND me.is_admin = "n" AND me.ban != "y" GROUP BY m.mem_id ORDER BY m.created DESC LIMIT :limit');
Ktore wybiera prawie dobrze i smiga az milo. Problem taki ze w czasie grupowania grupuje tylko rekordy o jednym category_id.
Czyli albo mam cat_id 1 albo 2 nigdy dwoch naraz.
Ogolnie macie jakies pomysly na zastapienie zapytania nr 2 czyms bardziej optymalnym?
Edit---
Kryzys zazegnany

SELECT m.*, c.name AS categoryName, me.profilenam, p.private_number FROM shout_messages m INNER JOIN shout_categories c ON m.category = c.cat_id INNER JOIN members me ON me.mem_id = m.mem_id INNER JOIN profiles p ON p.mem_id = m.mem_id INNER JOIN ( SELECT mem_id, MAX(created) AS created FROM shout_messages GROUP BY mem_id ) m2 ON( m.mem_id = m2.mem_id AND m.created = m2.created) WHERE me.mobile_verified = 1 AND me.is_admin = "n" AND me.ban != "y" ORDER BY m.created DESC LIMIT 10 ;