Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Suma rekordów z SELECT
Forum PHP.pl > Forum > Bazy danych > MySQL
deniol13
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)
mortus
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.
deniol13
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.