Clicky

Skocz do zawartości


Zdjęcie
- - - - -

Kohana DB sortowanie wg. najpopularniejszej wartosci

4 odpowiedzi w tym temacie

  • Zaloguj się, aby dodać odpowiedź

#1 mrbongo

mrbongo

    Początkujący

  • Użytkownik
  • Pip
  • 26 postów

Napisano 05 wrzesień 2013 - 03:49

Witam

Mam tabelke z uzytkownikami:
users:
id, name, email, password, invited_by(users.id)

i chcialbym moc pokazac uzytkownikow, ktorzy zaprosili najwiecej innych

tzn: dla przykladowych danych
id | name     | email       | password  | invited_by
---+----------+-------------+-----------+-----------
1  | John     | john@o2.pl  | fs43524   | NULL
2  | Alex     | ale@o2.pl   | fs43524   | 1
3  | Michael  | mich@o2.pl  | fs43524   | 1
4  | Tom      | tom@o2.pl   | fs43524   | 2
5  | Eva      | eva@o2.pl   | fs43524   | 2
6  | Maria    | maria@o2.pl | fs43524   | 2
7  | Lola     | lola@o2.pl  | fs43524   | 4

sortowanie powinno wygladac tak:
Alex, John, Tom, ...

Poniewaz alex zaprosil 3, john 2, a tom 1

Nie bardzo mam pomysl jak to zrobic tylko na SQL - bez pobierania wszystkiego do PHP i liczenia tam lub przynajmniej bez liczenia COUNT() dla kazdego rekordu w bazie.

#2 mck

mck

    Jestę Blogerę

  • Admin
  • 1544 postów

Napisano 05 wrzesień 2013 - 07:12

Możesz zrobić to na 2 sposoby: dodać w selekcie podzapytanie albo zrobić left joina.
SELECT *, (SELECT COUNT(*) FROM test1 AS t2 WHERE t2.invited_by=t.id) AS invitations
FROM test1 AS t
ORDER BY invitations DESC
LIMIT 50;
SELECT t.*, COUNT(t2.id) AS invitations
FROM test1 AS t
LEFT JOIN test1 AS t2 ON t.id=t2.invited_by
GROUP BY t.id
ORDER BY invitations DESC;
Z własnego doświadczenia podpowiem, że pierwszy sposób będzie nieco wydajniejszy :)

#3 phpion

phpion

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 774 postów
  • Skąd:Sosnowiec, Dąbrowa Górnicza

Napisano 05 wrzesień 2013 - 07:17

Złóż takie zapytanie w QB:
SELECT
	inviter.name,
	COUNT(users.id) AS counter
FROM
	users
	JOIN users AS inviter ON (users.invited_by = inviter.id)
WHERE
	users.invited_by IS NOT NULL
GROUP BY
	users.invited_by
ORDER BY
	counter DESC
;

@mck:
Ubiegłeś mnie. Powiadasz, że pierwszy sposób będzie wydajniejszy? Ten z podzapytaniem?
Notifero - Technologie Informatyczne | Warsztat: Kohana 3.x/2.x + PostgreSQL/MySQL | Programista Kohana

#4 mck

mck

    Jestę Blogerę

  • Admin
  • 1544 postów

Napisano 05 wrzesień 2013 - 10:53

@mck:
Ubiegłeś mnie. Powiadasz, że pierwszy sposób będzie wydajniejszy? Ten z podzapytaniem?

I tak i nie, to zależy do wersji mysqla :) W 6.x, na którym aktualnie siedzę, odczuwalnie poprawili optymalizację podzapytań. A z resztą i tak większość podzapytań jest konwertowana na joiny ;)

#5 mrbongo

mrbongo

    Początkujący

  • Użytkownik
  • Pip
  • 26 postów

Napisano 06 wrzesień 2013 - 02:15

Skorzystalem z pierwszej metody. Wszystko diala elegancko. Dzieki wielkie, Panowie :)




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych