Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  LEFT JOIN ja COUNT märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
redenergy
HV veteran
redenergy

liitunud: 22.03.2004




sõnum 02.01.2010 02:49:39 LEFT JOIN ja COUNT vasta tsitaadiga

Tervist.
Olen jamanud ühe asjaga väga kaua juba ja mõistus otsas vist.
Nimelt mul on fotoalbum. Seal tahaks kuvada Kasutajad ja selle kõrvale mitu albumit neil on.

sql:
  1.  
  2. $query = mysql_query("SELECT DISTINCT(kasutajad.kasutaja), kasutajad.id, COUNT(albumid.omanik) AS albumeid
  3. FROM kasutajad
  4. LEFT JOIN albumid
  5. ON kasutajad.id=albumid.omanik
  6. ORDER BY kasutajad.kasutaja")
  7. OR die(mysql_error());
  8. while($row = mysql_fetch_array($query)){
  9. $kasutajanimi = $row['kasutaja'];
  10. $albumeid = $row['albumeid'];
  11.  

Selle koodiga kui kasutada COUNT'i kuvab ta ainult ühe kasutaja. Aga miks?
Kui COUNT ära jätta kuvab kõik kasutajad aga selle asemel mitu albumit kellelgil on näitab hoopis tabelist album kasutaja ID'd.

Kas keegi teaks lahendust miks count ei tööta?
tänud
Kommentaarid: 30 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 02.01.2010 03:13:31 vasta tsitaadiga

COUNT töötab täpselt nagu pead, sa lihtsalt kasutad seda valesti.
Sa peaksid grupeerima tulemused millegi (antud juhul arvatavasti kasutajad.kasutaja) järgi GROUP BY abil. Ning DISTINCT viska minema.

_________________
ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
redenergy
HV veteran
redenergy

liitunud: 22.03.2004




sõnum 30.01.2010 17:28:31 vasta tsitaadiga

wow ja nii lihtne oligi. Tänan


------


Ei hakka uut teemat tegema.

Mul on kaks tabelit Summad ja Kategooriad.
Tulemus peaks olema selline, et kuvatakse kõik kategooriad ja iga kategooria kõrvale tuleks summa sinna kategooriasse lisatud numbritest.

Probleem aga on järgmine. Nimelt, kui Summad tabelis ei ole ühtegi vastava kategooriaga sisestust siis seda kategooriat ei kuvata.

Kood on mul hetkel selline
sql:
  1.  
  2. $result = mysql_query("SELECT Kategooriad.KategooriaNumber, Kategooriad.KategooriaNimi, Kategooriad.Tyyp, UNIX_TIMESTAMP(Kategooriad.timestamp) AS timestamp,
  3. Summad.KategooriaNumber, Summad.KasutajaID, SUM(Summad.Summa) AS Summa
  4. FROM Kategooriad
  5. LEFT JOIN Summad
  6. ON Kategooriad.KategooriaNumber=Summad.KategooriaNumber
  7. WHERE Kategooriad.KasutajaID='".$_SESSION['sees']['KasutajaID']."' AND Summad.KasutajaID='".$_SESSION['sees']['KasutajaID']."'
  8. GROUP BY Kategooriad.KategooriaNimi
  9. ORDER BY Summa")
  10.  

ehk keegi oskab aidata?
Kommentaarid: 30 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 30.01.2010 18:47:11 vasta tsitaadiga

Asi on selles, et Summad.KasutajaID kontroll WHERE klauslis eemaldab need read enne GROUP BY-d (see ei ole tehniliselt küll päris täpne selgitus, kuid enamvähem).
Kuna Summad.KasutajaID on sama mis Kategooriad.KasutajaID siis pane need LEFT JOIN-i kirja:

sql:
  1. SELECT Kategooriad.KategooriaNumber, Kategooriad.KategooriaNimi, Kategooriad.Tyyp, UNIX_TIMESTAMP(Kategooriad.timestamp) AS timestamp, Summad.KategooriaNumber, Summad.KasutajaID, SUM(Summad.Summa) AS Summa
  2. FROM Kategooriad
  3. LEFT JOIN Summad ON Kategooriad.KategooriaNumber = Summad.KategooriaNumber AND Summad.KasutajaID = Kategooriad.KasutajaID
  4. WHERE Kategooriad.KasutajaID = $_SESSION['sees']['KasutajaID']
  5. GROUP BY Kategooriad.KategooriaNimi
  6. ORDER BY Summa;


NB: Sa saad MySQL-s tabelite nimedele aliasi panna, et sa päringus alati neid pikalt välja ei peaks kirjutama, näiteks:

sql:
  1. SELECT k.KategooriaNumber, k.KategooriaNimi, k.Tyyp, UNIX_TIMESTAMP(k.timestamp) AS timestamp, s.KategooriaNumber, s.KasutajaID, SUM(s.Summa) AS Summa
  2. FROM Kategooriad k
  3. LEFT JOIN Summad s ON k.KategooriaNumber = s.KategooriaNumber AND s.KasutajaID = k.KasutajaID
  4. WHERE k.KasutajaID = $_SESSION['sees']['KasutajaID']
  5. GROUP BY k.KategooriaNimi
  6. ORDER BY Summa;

_________________
ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
redenergy
HV veteran
redenergy

liitunud: 22.03.2004




sõnum 30.01.2010 23:03:32 vasta tsitaadiga

Suured-suured tänud. Sain jälle targemaks.

Aga nüüd tekkis teine küsimus.
Iga kategooria esindab mul ka linki näiteks: index.php?leht=kategooria&kategoorianr=3
See number on siis sõltuvalt iga kategooria numbrist.

Probleem on aga selles, et ilma summata kategoorial ei tule numbrit sinna.
Kas selle vastu on ka lihtsamat rohtu või pean hakkama miskit pornot välja mõtlema icon_razz1.gif ?
Kommentaarid: 30 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  LEFT JOIN ja COUNT
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.