[Mysql] order by (count+count+dana)

Odpowiedz Nowy wątek
2007-10-05 12:40
poszukujacy_prawdy
0

Witam,
Mam zapytanie, moze wydawac sie skomplikowane ale jest proste. Sumuje w nim liczbe komentarzy oraz liczbe ocen a orderuje je po sumie komentarzy.

Chcialbym orderowac to (ORDER BY) po sumie komentarzy (commentscount) + sumie ocen (ratings_count) + user_posts

Wygladaloby to tak ORDER BY (commentscount+ratings_count+user_posts)
Jednak jak wiadomo niemozna wykonywac operacji w order by, jak to przemienic zeby to bylo mozliwe bo tutaj totalnie wysiadlem.

$result = dbquery("
SELECT user_id, user_avatar, user_posts, user_name, comment_name, count(*) AS commentscount,
  (
    SELECT count(*)
    FROM fusion_ratings
    WHERE rating_user = user_id
  ) AS ratings_count
FROM fusion_comments c
INNER JOIN fusion_users u ON u.user_id = c.comment_name
GROUP BY u.user_id
ORDER BY commentscount DESC

Pozostało 580 znaków

2007-10-05 14:17
0

dodaj kolumnę, która będzie sumą tamtych trzech


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2007-10-05 17:29
guanski_grabator
0
Misiekd napisał(a)

dodaj kolumnę, która będzie sumą tamtych trzech

a dokladniej? jaka kolumne.. w bazie danych czy w tym zapytaniu czy co... jak

Pozostało 580 znaków

2007-10-05 18:27
0
select
 ...
 commentscount + ratings_count as sum_count -- dynamiczna kolumna
  ...
order by
  sum_count

Pozostało 580 znaków

2007-10-05 18:51
garbaty_gargulec
0

oo dzieki teraz juz cieplej ale nadal ciezko mi to idzie ;]

SELECT user_id, user_avatar, user_posts, user_name, comment_name, count(*) AS commentscount,
  (
    SELECT count(*)
    FROM fusion_ratings
    WHERE rating_user = user_id
  ) AS ratings_count
  (
,commentscount + ratings_count + user_posts AS sum_count
FROM fusion_comments c
INNER JOIN fusion_users u ON u.user_id = c.comment_name
GROUP BY u.user_id
ORDER BY sum_count DESC

i wyskakuje syntax :P ... generalnie mowiles zeby to dac miedzy select a order... czyli gdzies w zapytaniu calym :{ dobrze to umeiszczam? bo jeszcze syntaxuje

Pozostało 580 znaków

2007-10-05 18:59
jacus_pierdus
0

Sory za glupi blad ;] teraz jest sensowniejszy...

SELECT user_id, user_avatar, user_posts, user_name, comment_name, count(*) AS commentscount,
  (
    SELECT count(*)
    FROM fusion_ratings
    WHERE rating_user = user_id
  ) AS ratings_count
,commentscount + ratings_count + user_posts AS sum_count
FROM fusion_comments c
INNER JOIN fusion_users u ON u.user_id = c.comment_name
GROUP BY u.user_id
ORDER BY sum_count DESC

wywala

Nieznana kolumna 'commentscount' w field listNieznana kolumna 'commentscount' w field listNieznana kolumna 'commentscount' w field list

Pozostało 580 znaków

2007-10-05 19:36
0

no to fizycznie zrob w bazie taka kolumne i przy modyfikacjach zmieniaj wartosci, bedzie szybsze przy wyszuikiwaniu, bo nie trzeba bedzie przy kazdym selekcie liczyc sum.

Pozostało 580 znaków

2007-10-05 20:02
poo_rator
0

ta ale to jest skrypt w cronie ustawiony zeby wyliczal ranking uzytkownikow co godzine.... i zapisywal wynik do pliku tekstowego z ktorego na stronie www jest wczytywana tabelka najlepszych userow wedlug komentarze + oceny + posty = rank z tego pliku wynikowego

wiec potrzebuje to zrobic w jednym/kilku zapytaniach ale w obrebie jednego pliku/skryptu zeby miec efekt taki, ze na koncu ORDER BY komenty + oceny + posty

; ] mozna to zapytanie pewnie ulozyc inaczej.... SELECT count comenty UNION select oceny UNION select posty group by, order by? Takie cos mozliwe? ;)

pozdro

Pozostało 580 znaków

2007-10-05 20:39
0
SELECT user_id, user_avatar, user_posts, user_name, comment_name, count(*) AS commentscount,
  (
    SELECT count(*)
    FROM fusion_ratings
    WHERE rating_user = user_id
  ) AS ratings_count
,count(*) + ratings_count + user_posts AS sum_count
FROM fusion_comments c
INNER JOIN fusion_users u ON u.user_id = c.comment_name
GROUP BY u.user_id
ORDER BY sum_count DESC

a jak nie zadziała to

SELECT user_id, user_avatar, user_posts, user_name, comment_name, count(*) AS commentscount,
  (
    SELECT count(*)
    FROM fusion_ratings
    WHERE rating_user = user_id
  ) AS ratings_count
,count(*) +  (SELECT count(*) FROM fusion_ratings WHERE rating_user = user_id)  + user_posts AS sum_count
FROM fusion_comments c
INNER JOIN fusion_users u ON u.user_id = c.comment_name
GROUP BY u.user_id
ORDER BY sum_count DESC

ale trzeba by pomyśleć, czy nie da się tego prościej ale do tego trzeba mieć tabele iwiedzieć co chcesz z nich wyciągnąć

PS z union to nie zadziała bo to całkiem co innego

PS2 najprawdopodobniej szybsza była by procedura na serwerze

PS3 zamiast do pliku możesz to do tabeli zapisywać


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2007-10-05 21:10
garbaty_aniol
0

Ta pierwsza wersja dziala, stokrotne dzieki sam bym tego niewymyslil, dziwne to takie jak to analizuje...

co do szybkosci nietrzeba sie martwic bo to sie wykonuje co godzine wiec i tak duzo nieobciazy
co do pliku, szybciej wczytac z pliku niz pobrac z bazy danych czysta jedna dana
co do prosciej, problem jest taki ze to jest rozsiane po trzech tabelach stad klopoty no i dwa county w jednym zapytaniu :P, takie rzeczy sie zadko stosuje....

dzieki jeszcze raz

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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