Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Sumowanie, łączenie 2 tabel
Forum PHP.pl > Forum > Przedszkole
slawo
Na moim portalu chciałbym wyrzucić użytkownikowi płyty, które pobrał a nie ocenił. Tabela plyty i tabela ocena z id plyty i wybrana ocena. Jak policzyć ocenione płyty, które jednocześnie zostały pobrane? Użytkownik mógł ocenić płyt, których nie pobrał. Tu mam mały problem.

SELECT count(id) FROM plyty,oceny WHERE login_pobral=login_ocenil;
markuz
Pokaż strukturę tych tabel.
goartur
  1. SELECT (SELECT COUNT(*) FROM table1) + (SELECT COUNT(*) FROM table2) FROM dual


A nie lepiej poprostu pobrac 2 tabele osobno i sprawidzic ilosc wynikow i je podsumowac?
slawo
albumy_pobrania: id | album | login
albumy_ocena: id | album | dodal

album - numer ID płyty z bazy

Wynikiem ma być ilość nieocenionych pobranych płyt. Tzn:

jeżeli użytkownik pobrał 5 płyt nie ocenił żadnej wynik ma być 5
jeżeli użytkownik pobrał 5 płyt a ocenił inne płyty wynik ma być 5
jeżeli użytkownik pobrał 5 płyt i ocenił 3 z nich wynik ma być 2
jeżeli użytkownik pobrał 5 płyt i ocenił te 5 płyt wynik ma być 0


  1. $licz_plyty_nieocenione = mysql_query("SELECT COUNT(*) as ilosc FROM albumy_ocena,albumy_pobrania WHERE login=dodal AND album=album AND login='$login' AND dodal='$login'");
  2. $lpo = mysql_fetch_array($licz_plyty_nieocenione, MYSQL_ASSOC);


Nie działa, może dlatego, że album=album?

Chyba mam:

  1. $licz_plyty_ocenione = mysql_query("SELECT COUNT(*) as ilosc FROM albumy_ocena a,albumy_pobrania b WHERE b.login=a.dodal AND a.album=b.album AND b.login='$login' AND a.dodal='$login'");
  2. $lpo = mysql_fetch_array($licz_plyty_ocenione, MYSQL_ASSOC);


Jednak nie działa do końca jak trzeba ;( Muszę coś jeszcze dopisać...
mmmmmmm
  1. SELECT Count(p.id) ilosc_pobranych, Count(o.id) ilosc_ocenionych FROM albumy_pobrania o LEFT JOIN albumy_ocena o ON o.login=p.login AND p.album=o.album
slawo
Sprawdze jak będę w domu. Jeszcze jeden warunek trzeba dopisać. Niektóre płyty są pobrane 2, 3 razy i liczy. Powinno policzyć pojedyńczo niezależnie od ilości pobrań.
Toshikatsu
A mnie zastanawia ile to lat trzeba ćwiczyć żeby zrobić zapytanie z jednym joinem? :V
W ogóle szukasz czegoś sam czy za każdym razem przylatujesz tutaj z czymś co chcesz i liczysz, że ktoś wszystko zrobi?

Group by/Distinct - mówi Ci to coś?
slawo
Wiem, że trzeba pogrupować. Nikt nie musi mi tego pisać. Spokojnie.

Okej mam, działa. Jeśli wyniki tych dwóch zapytań będą takie same to oznacza, że wszystkie pobrane płyty zostały ocenione Lkingsmiley.png Dziękuje wszystkim za pomoc! thumbsupsmileyanim.gif

  1. $licz_plyty_ocenione = mysql_query("SELECT COUNT(DISTINCT a.album) as ilosc FROM albumy_pobrania a, albumy_ocena b WHERE a.login=b.dodal AND a.login='$login' AND b.dodal='$login' AND a.album=b.album");
  2. $lpo = mysql_fetch_array($licz_plyty_ocenione, MYSQL_ASSOC);
  3.  
  4. $licz_plyty_pobrane = mysql_query("SELECT COUNT(DISTINCT album) as ilosc2 FROM albumy_pobrania WHERE login='$login'");
  5. $lpp = mysql_fetch_array($licz_plyty_pobrane, MYSQL_ASSOC);
mmmmmmm
Po c. piszesz na forum, skoro nie stosujesz się do odpowiedzi?
W 1 linii towjego kodu użyj JOIN -m się prosi.
A gdybyś użył LEFT JOIN (czyli takie zapytanie jak ja powyżej), to zrobiłbyś to za jednym zamachem. Dla 400 rekordów nie odczujesz różnicy, dla 400 tysięcy tak.
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.