Gå til innhold

Kombinere 2 mysql forspørsler?


Anbefalte innlegg

Heisann, veit dette i teorien ikke går under php, men jeg må jo i tillegg ha hjelp til å hente det ut ;)

Til poenget.

 

Har en kode som ser slik ut nå *klippe klippe*

	$q=$sql->query("SELECT * FROM nyheter ORDER BY id DESC LIMIT 0, 10");
   	echo '<div id="innhold">';
   while($rad=$sql->fetch($q)) {
   $id=$rad['id'];
   $q3=$sql->query("SELECT COUNT(*) FROM kommentarer WHERE nid=$id");
   $kommentarer=$sql->result($q3);

Dette funker jo foreløbig bra, men jeg vil jo selvfølgelig lære å få så få queries som mulig, da jeg liker å lære, samt at ting går fortere har vel aldri vært ett minus ;)

 

Kikka litt på join osv, men skjønte så lite :/

 

Takker for all hjelp!

Lenke til kommentar
Videoannonse
Annonse

Du er inne på rett tema, join.

SQL er et eget programmeringsspråk og det finnes mange bøker om dette. Mange kjøper en bok om PHP og mysql og tror da at de kan SQL. De fleste har sikkert lært en del SQL da, men de fleste php bøkene viser kun enkle spørringer.

 

For å løse ditt "problem" kan du bruke LEFT JOIN, f.eks.:

SELECT felt1, felt2, COUNT(felt) FROM nyheter LEFT JOIN kommentarer ON nyheter.id = kommentarer.nid GROUP BY kommentarer.nid ORDER BY id DESC LIMIT 0,10

 

Etter hvert når du begynner å utvikle mer avanserte script vil du fort oppdage hvor viktig SQL er. Start med en bok som SQL for dummies - den boken er faktisk bra!

Lenke til kommentar

Takker så mye for svar.

skal se hva jeg får ut av querien din.

Ser at denne "SQL for dummies" boka har kommet i flere versjoner, (editions).

Er det bare å velge den siste da eller går bøkene fra 1 og oppover?

Slik at jeg må lese den første versjonen av boka og lese meg oppover til den siste?

 

Tror SQL for dummies passer meg bra, ligger i tittelen :thumbup:

Lenke til kommentar

Ok, takker! :)

Har ett lite problem akkurat nå, men jeg skal prøve litt til, kan hende jeg redigerer denne posten når jeg står fast ;)

 

edit: SirIce: tror du får kjøpt ett fåtall i norge, må kanskje i store butikker for å få tak i dem. en venn av meg kjøpte en utrolig god bok jeg låner, men veit ikke om han kjøpte den i norge. Den er ihvertfall utrolig lett å lære av! :)

 

Heter forøvrig "PHP for the world wide web - by larry ullman"

Men jeg tror nesten at man må få tak i en ren sql bok for å lære sql på den måten jeg driver å lærer nå :/

Endret av LoS
Lenke til kommentar

amazon er et bra sted for å kjøpe bøker. Hvis du vil kjøpe de i norge er det litt avhengig av hvor du bor. Bor du i Oslo så finnes det mange butikker som bare har pc bøker, som datajungelen. De fleste bokhandlere kan skaffe en et bra utvalg av bøker, men det er som regel en del billigere å bestille de fra amazon (glem ikke at det ikke er mva. på bøker du importerer)

Lenke til kommentar

Greit, jeg finner ikke svaret på problemet mitt.

Nå har jeg gjort det slik:

	$q=$sql->query("SELECT nyheter.*, COUNT(nid) FROM nyheter LEFT JOIN kommentarer ON nyheter.id = kommentarer.nid GROUP BY kommentarer.nid ORDER BY nyheter.id DESC LIMIT 0,10");
   echo '<div id="innhold">';
   if ($rad=$sql->fetch($q) AND $kommentarer=$sql->result($q)){
   do {
   	echo '<div class="nyhetsramme"><h2>'
       .$rad['overskrift']
   	.'</h2><div class="nyhet"><p class="nyhet">'
       .$rad['ingress']
       .'</p></div><p class="tid">';
       if (!empty($rad['nyhet'])) {
       echo '<a href="index.php?op=mer&id='.$rad['id'].'">Les mer...</a> | ';
       }
       if ($_SESSION['id']){ echo '<a href="index.php?op=rediger&id='.$rad['id'].'">Rediger</a> | <a href="index.php?op=slett&id='.$rad['id'].'">Slett</a> | ';
       }
       echo '<a href="index.php?op=mer&id='.$rad['id'].'">'.$kommentarer.' kommentar'; if($kommentarer != "1"){ echo "er";}echo '</a> | '.$tid->dato($rad['tid'])
       .'</p></div><br /><br />';

   }
   while($rad=$sql->fetch($q));
   }
       	echo '</div>';

Sorry for at det er litt å pløye igjennom.

Problemet er bare det at jeg har 5 nyheter, 3 av disse kommer fram, jeg har til sammen 3 kommentarer, der teller den til 7 på hver nyhet, hva gjør jeg feil?

 

Takker for alle inspill, blir nok bedre når jeg får tak i en bok å lese :)

 

edit:veit koden er litt rar, men den er ikke ferdig enda, og php programmet mitt ville tydeligvis ikke kopiere skikkelig ut, så koden ser ut som ett h.... ;)

Endret av LoS
Lenke til kommentar
Greit, jeg finner ikke svaret på problemet mitt.

Nå har jeg gjort det slik:

	$q=$sql->query("SELECT nyheter.*, COUNT(nid) FROM nyheter LEFT JOIN kommentarer ON nyheter.id = kommentarer.nid GROUP BY kommentarer.nid ORDER BY nyheter.id DESC LIMIT 0,10");
   echo '<div id="innhold">';
   if ($rad=$sql->fetch($q) AND $kommentarer=$sql->result($q)){
   do {
   	echo '<div class="nyhetsramme"><h2>'
       .$rad['overskrift']
   	.'</h2><div class="nyhet"><p class="nyhet">'
       .$rad['ingress']
       .'</p></div><p class="tid">';
       if (!empty($rad['nyhet'])) {
       echo '<a href="index.php?op=mer&id='.$rad['id'].'">Les mer...</a> | ';
       }
       if ($_SESSION['id']){ echo '<a href="index.php?op=rediger&id='.$rad['id'].'">Rediger</a> | <a href="index.php?op=slett&id='.$rad['id'].'">Slett</a> | ';
       }
       echo '<a href="index.php?op=mer&id='.$rad['id'].'">'.$kommentarer.' kommentar'; if($kommentarer != "1"){ echo "er";}echo '</a> | '.$tid->dato($rad['tid'])
       .'</p></div><br /><br />';

   }
   while($rad=$sql->fetch($q));
   }
       	echo '</div>';

Sorry for at det er litt å pløye igjennom.

Problemet er bare det at jeg har 5 nyheter, 3 av disse kommer fram, jeg har til sammen 3 kommentarer, der teller den til 7 på hver nyhet, hva gjør jeg feil?

 

Takker for alle inspill, blir nok bedre når jeg får tak i en bok å lese :)

 

edit:veit koden er litt rar, men den er ikke ferdig enda, og php programmet mitt ville tydeligvis ikke kopiere skikkelig ut, så koden ser ut som ett h.... ;)

Du må bruke OUTER JOIN (left eller right, husker ikke). Ellers vil ikke nyhetene uten kommentarer komme med i datasettet.

Lenke til kommentar

Glemte kanskje å ta med en litt viktig detalj her.

De tre nyhtene jeg får fram, der har den ene 0 kommentarer, den andre har 1 kommentar, og den siste har 2 kommentarer.

Når jeg brukt OUTER JOIN så fikk jeg bare fram de som hadde kommentarer.

Lenke til kommentar
Glemte kanskje å ta med en litt viktig detalj her.

De tre nyhtene jeg får fram, der har den ene 0 kommentarer, den andre har 1 kommentar, og den siste har 2 kommentarer.

Når jeg brukt OUTER JOIN så fikk jeg bare fram de som hadde kommentarer.

Heh... :blush:

Jeg leste ikke hva som var problemet, og antok noe helt annet...

Hva er felles for de nyhetene som ikke kommer frem da? Er det noe mønster her?

Lenke til kommentar

Vet ikke hvorfor du bare får 3 rader.

Får å få riktig antall kan du sette navn på kolonnen count(nid). Endre den til count(nid) AS antall, så kan du hente ut antall kommentarer pr. nyhet fra $rad['antall'].

Lenke til kommentar

Det første du burde gjøre er å passe på at feltene er av samme type, nid er varchar og nyheter.id er int.

 

Du burde bruke left join. Pass på at du setter ON korrekt og tenk litt på group by - slik at du grupperer rett felt. Det ser ut som spørringen skal fungere hvis du retter feltet - hvis ikke kan jeg ta en kikk på tabellene dine ;)

 

Test alltid spørringer direkte mot sql og ikke i php, for å utelukke feil i php koder.

 

Edit:

du burde også legge til tabellnavnet i denne "COUNT(nid)" blir litt å lese koden. Eventuelt bruke AS

Endret av ????????
Lenke til kommentar

Kjørte akkurat spørringen i SSH på serveren, og da kom det kun 3 rader, nå er det ikke noen feil i php ihvertfall.

Men jeg snakka med sven-o på PM i stad, i følge han fikk han kjørt scriptet slik det skulle blitt kjørt.

 

edit: all data som kommer ut nå, er korrekt, det kommer bare ikke nok rader.

Endret av LoS
Lenke til kommentar

Så feilen:

Du må tenke nøye gjennom group by,

ikke GROUP BY kommentarer.nid - det er ikke det du er ute etter - prøv heller GROUP BY nyheter.id

 

EDIT:

vi postet nesten samtidig så jeg så ikke det du skrev. Det virker som det også kan skyldes group by. Poenget med LEFT JOIN er nettopp at den joiner tabell 2 hvis det er data i den som passer, tabell 1 er alltid med - ved mindre du begrenser det med f.eks. group by.

 

Poster du spørringen her slik at andre kan se den. Mange som sikkert vil lære å joine tabeller.

Endret av ????????
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...