Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Suma rekordów z SELECT
deniol13
post
Post #1





Grupa: Zarejestrowani
Postów: 190
Pomógł: 2
Dołączył: 30.11.2009

Ostrzeżenie: (10%)
X----


Przperaszam za nazwę tematu, nie wiedziałem jak nazwać odpowiednio do problemu. Chodzi o to że chcę pobrać X newsów z największą liczbą wyświetleń z ostatnich Y dni.

Tabela mt_views w której zapisane są ilości wyświetleń na poszczególne dni i miesiące wygląda tak
  1. news_id | month | day | views


Przykładowe wpisy

  1. 19 | 8 | 26 | 33
  2. 19 | 8 | 25 | 64
  3. 22 | 8 | 26 | 13
  4. 22 | 8 | 25 | 44
  5. 27 | 8 | 26 | 32


Chcę pobrać to w taki sposób aby mieć np dwa wyniki (X z początku tematu) których suma wyświetleń z ostatnich 5 dni (Y) jest największa, mógłbym pobrać wszystko a potem w pętli sobie to policzyć ale po co mam pobierać 900 wpisów skoro potrzebuję tylko 2 etc.


Mam nadzieję że wytłumaczyłem mój problem.

Zobrazuję to trochę inaczej

Zawartosc tabeli
  1. 19 | 8 | 26 | 33
  2. 19 | 8 | 25 | 64
  3. 22 | 8 | 26 | 13
  4. 22 | 8 | 25 | 44
  5. 27 | 8 | 26 | 32


Jak widzimy news o id 19 ma w ciagu ostatnich dwoch dni (26, 25) 97wyswietlen
ID 22: 57
IDl 27: 32

I ja chce pobrac dwa najpopularniejsze newsy czyli z taka zawartoscia tabeli powinno mi wyjsc news o id 19 (97 wyswietlen) i news o id 22 (57)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Będzie ciężko, bo w strukturze tabeli nie uwzględniono roku (dlatego wpisy z zeszłego roku też będą policzone i dlatego trzeba zmienić strukturę tabeli). Poza tym bez sensu rozbito dzień i miesiąc, co tylko utrudnia sprawę. Jednak:
  1. SELECT `n`.`id`, `n`.`title`, `most_popular_news`.`all_views`
  2. FROM `news` `n`
  3. LEFT JOIN
  4. (SELECT `news_id`, SUM(`views`) AS `all_views`
  5. FROM `mt_views`
  6. WHERE `month` >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 5 DAY), '%c')
  7. AND `day` >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 5 DAY), '%e')
  8. GROUP BY `news_id`
  9. LIMIT 0, 2
  10. ) AS `most_popular_news` ON `most_popular_news`.`news_id` = `n`.`id`;

Jak widać zapytanie pobiera 2 najpopularniejsze newsy wraz z liczbą ich wyświetleń w przeciągu ostatnich 5 dni.

EDIT
Wydajność przy dużej liczbie danych może nie być najwyższa.

Ten post edytował mortus 26.08.2011, 19:24:50
Go to the top of the page
+Quote Post
deniol13
post
Post #3





Grupa: Zarejestrowani
Postów: 190
Pomógł: 2
Dołączył: 30.11.2009

Ostrzeżenie: (10%)
X----


udalo mi sie to zrobic, cus takiego

  1. SELECT v.news_id, SUM( v.views ) AS views_p, n.news_id, n.news_title, n.news_text
  2. FROM views v
  3. LEFT JOIN news n
  4. ON v.news_id = n.news_id
  5. WHERE year = ' . date( 'Y' ) . '
  6. AND day > ' . ( date( 'z' ) - ( $days + 1 ) ) . '
  7. AND day < ' . ( date( 'z' ) + 1 ). '
  8. GROUP BY v.news_id
  9. ORDER BY views_p DESC
  10. LIMIT ' . $this->Core->settings['popular_items']


jest tu pewien blad ;p ale da sie skorzystac
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: 25.08.2025 - 06:49