Hej,

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:

  1. SELECT m.*, c.name AS categoryName, me.profilenam, p.private_number FROM shout_messages m
  2. INNER JOIN shout_categories c ON (m.category = c.cat_id)
  3. INNER JOIN members me ON (me.mem_id = m.mem_id)
  4. INNER JOIN profiles p ON(p.mem_id = m.mem_id)
  5. WHERE m.created IN(
  6. SELECT MAX(created) FROM shout_messages GROUP BY mem_id)


Ktore w uporoszczonej postaci wyglada tak:

  1. 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:

  1. SELECT m.*, c.name AS categoryName, me.profilenam, p.private_number, me.gender,
  2. SUBSTRING( MAX( CONCAT(LPAD(m.created,10,\'0'),shout) ), 10+1) AS shout,
  3. MAX(m.created) as created
  4. FROM shout_messages m
  5. INNER JOIN shout_categories c ON (m.category = c.cat_id)
  6. INNER JOIN members me ON (me.mem_id = m.mem_id)
  7. 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"
  8. GROUP BY m.mem_id
  9. 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 smile.gif

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