Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pozbycie sie podzapytania., Problem z grupowaniem wynikow.
thornag
post
Post #1





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 ;


Ten post edytował thornag 9.05.2008, 09:53:03
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 12:16