TheClown Skrevet 1. oktober 2007 Del Skrevet 1. oktober 2007 (endret) NYTT PROBLEM. SKJEKK NEDERSTE POST! Heisann igjen! Jeg har et problem med scriptet på siden min, den har funka fint kjempelenge, men nå har det skjedde noe rart. På forsiden skal scriptet hente ut de 10 siste "linkene" som er lagt til i databasen. Outputen på siden viser dobbelt opp av hvert resultat. Jeg har gått nøye igjennom scriptet (og databasen) men jeg finner ikke ut hva som er feil. Index.php Scriptet: $getlinksfront = "SELECT t1.link_id, t1.link_posted, t1.link_title, t1.user_id, t1.cat_id, t2.user_id, t2.username, t3.cat_id, t3.cat_name FROM link t1, user t2, cat t3 ORDER BY t1.link_id DESC LIMIT 10"; $result0=mysql_query($getlinksfront) or die(mysql_error()); while ($row0=mysql_fetch_assoc($result0)) { echo "<h3><a href='viewlink.php?id=".$row0['link_id']."' >".$row0['link_title']."</a></h3>"; echo "<br />"; echo "Postet av: <a href='viewprofile.php?id=".$row0['user_id']."' >".$row0['username']."</a> | Kategori: <a href='viewcat.php?id=".$row0['cat_id']."' >".$row0['cat_name']."</a> | Publisert: " . $row0['link_posted'] . ""; echo "<br />"; } Databasen: Anyone? Endret 1. oktober 2007 av TheClown Lenke til kommentar
kaffenils Skrevet 1. oktober 2007 Del Skrevet 1. oktober 2007 Du SELECTer fra tre tabeller, men definerer ikke hvordan de er linket sammen. Lær deg SQL først. Lenke til kommentar
TheClown Skrevet 1. oktober 2007 Forfatter Del Skrevet 1. oktober 2007 (endret) Jøsses. Så ikke at halve linja mangla. Funka fint nå $getlinksfront = "SELECT t1.link_id, t1.link_posted, t1.link_title, t1.user_id, t1.cat_id, t2.user_id, t2.username, t3.cat_id, t3.cat_name FROM link t1, user t2, cat t3 WHERE t1.user_id = t2.user_id AND t1.cat_id = t3.cat_id ORDER BY t1.link_id DESC LIMIT 10"; Endret 1. oktober 2007 av TheClown Lenke til kommentar
TheClown Skrevet 1. oktober 2007 Forfatter Del Skrevet 1. oktober 2007 BONUSSPØRSMÅL! Hvorfor får jeg mange like outputs i dette scriptet når det bare finnes en av dem i databasen? $getcomment = "SELECT t1.com_id, t1.link_id, t1.user_id, t1.com_posted, t1.com_text, 1.visible, t3.user_id, t3.username FROM comments t1, link t2, user t3 WHERE t1.link_id = $_GET[id] AND t1.user_id = t3.user_id ORDER BY t1.com_id DESC"; $result3=mysql_query($getcomment) or die(mysql_error()); $row3 = mysql_num_rows($result3); if ($row3 > 0 ) // There is comments posted { while ($row3=mysql_fetch_assoc($result3)) { echo "<a href='index.php?p=viewprofile&id=".$row3['user_id']."' target='_blank' >".$row3['username']."</a> wrote $row3[com_posted]"; echo "<br />"; echo $row3['com_text']; echo "<br />"; echo "<br />"; } } else { // No comments posted echo "Ingen kommentarer postet! Bli den første!"; } Evt. pastebin.com Siden Lenke til kommentar
espen_b Skrevet 1. oktober 2007 Del Skrevet 1. oktober 2007 Hei Vet ikke om det har noe med feilen din, men du har med en link t2 tabell og den er ikke linket i where. I tillegg har du en liten skrive feil 1.visible skal vell være t1.visible. Lenke til kommentar
TheClown Skrevet 1. oktober 2007 Forfatter Del Skrevet 1. oktober 2007 (endret) Men t1.user_id henger sammen med t3.user_id og t3.username henger sammen med den igjen. Prøvd litt frem og tilbake nå, men jeg får det ikke til å funke. Prøvd å slette username hentinga, men det gjorde ingen forskjell. Endret 1. oktober 2007 av TheClown Lenke til kommentar
kaffenils Skrevet 2. oktober 2007 Del Skrevet 2. oktober 2007 Les gjennom SQL setningen en gang til... Hvor er det du joiner t2 med t1 eller t3? Dessuten anbefaler jeg deg å IKKE bruke den syntaksen du gjør for å knytte sammen tabeller. Bruke heller JOIN ... ON statementet og ikke gjør knytningene mellom tabellene i WHERE. Eks: select ... from comments t1 inner join user t3 on t1.user_id=t3.user_id Siden jeg ikke vet hvordan t2 er relatert til t1 eller t3 så kan jeg ikke legge den ved i eksempelet. Lenke til kommentar
CruellaDeVille Skrevet 2. oktober 2007 Del Skrevet 2. oktober 2007 Dessuten anbefaler jeg deg å IKKE bruke den syntaksen du gjør for å knytte sammen tabeller. Bruke heller JOIN ... ON statementet og ikke gjør knytningene mellom tabellene i WHERE. Hvorfor anbefaler du dette? hvorfor er en inner join on... bedre enn where x=y? Lenke til kommentar
blackbrrd Skrevet 2. oktober 2007 Del Skrevet 2. oktober 2007 (endret) Helt enig med kaffenils, det er veldig mye lettere å lese, se bare på eksemplet nedenfor (din egen spørring gjort om til JOIN ON syntax. SELECT t1.com_id, t1.link_id, t1.user_id, t1.com_posted, t1.com_text, 1.visible, t3.user_id, t3.username FROM comments t1 INNER JOIN user t3 ON t1.user_id = t3.user_id ..... JOIN link t2 ...... ... ....... WHERE t1.link_id = $_GET[id] ORDER BY t1.com_id DESC Fyll ut de prikkede feltene, så vil spørringen din fungere. Ytelsesmessig så burde det ikke ha noe å si... Endret 2. oktober 2007 av blackbrrd Lenke til kommentar
Babelfisken Skrevet 3. oktober 2007 Del Skrevet 3. oktober 2007 Helt enig med kaffenils, det er veldig mye lettere å lese, se bare på eksemplet nedenfor (din egen spørring gjort om til JOIN ON syntax. SELECT t1.com_id, t1.link_id, t1.user_id, t1.com_posted, t1.com_text, 1.visible, t3.user_id, t3.username FROM comments t1 INNER JOIN user t3 ON t1.user_id = t3.user_id ..... JOIN link t2 ...... ... ....... WHERE t1.link_id = $_GET[id] ORDER BY t1.com_id DESC Fyll ut de prikkede feltene, så vil spørringen din fungere. Ytelsesmessig så burde det ikke ha noe å si... 9623615[/snapback] Hvor mye enklere det er å lese er vel en smakssak. Personlig synes jeg gamlemåten er enklere. Lenke til kommentar
blackbrrd Skrevet 3. oktober 2007 Del Skrevet 3. oktober 2007 Gamlemåten blir verre og verre å lese jo flere tabeller du skal joine inn. Du må jo lese fram og tilbake i koden, først se på FROM clausen og deretter se på WHERE clausen, fram og tilbake, fram og tilbake. Sjansen for at du ikke ser noe, som i dette eksempelet er ganske stor. Lenke til kommentar
kaffenils Skrevet 3. oktober 2007 Del Skrevet 3. oktober 2007 Det har faktisk noe å si ytelsesmessig også. Spesielt ved bruk av OUTER JOINS. Her er et eksempel. Det er helt meningsløst, men viser allikevel foskjellen mellom å definer JOIN condition i ON og i WHERE. Du har to tabeller Mat og Personer. Mat er en liste over diverse matprodukter med et bool flagg som sier om maten er sunn eller ikke. Personer inneholder kolonnene Navn og Favorittmat (FK til Mat) Oppgaven min til deg er som følger: List ut alle rader i Personer. Hvis de har en favorittmat som er subb (ErSunt=1) så skal verdien vises i kolonnen MatBeskrivelse. Hvis personen ikke har en favorittmat eller hvis maten er usunn (ErSunt=0) så skal kolonnen ha NULL verdi (NULL som i ingen verdi, ikke teksten 'NULL') Her er tabelldef og data: create table Mat(MatId int primary key, MatBeskrivelse varchar(50), ErSunt bit not null) create table Personer(PersonId int primary key, Navn varchar(50), FavorittMat int constraint FK_Mat foreign key references Mat(MatId)) create index IX_Personer_FavorittMat on Personer(FavorittMat) insert into Mat values(1,'Eple',1) insert into Mat values(2,'Coka Cola',0) insert into Mat values(3,'Kylling',1) insert into Mat values(4,'Fisk',1) insert into Mat values(5,'Delfiakake',0) insert into Mat values(6,'Smutring',0) insert into Mat values(7,'Fullkornsbrød',1) insert into Mat values(8,'Leverpostei',1) insert into Personer values(1,'Per',1) insert into Personer values(2,'Arne',2) insert into Personer values(3,'Kåre',5) insert into Personer values(4,'Lise',4) insert into Personer values(5,'Jonas',4) insert into Personer values(6,'Anne',6) insert into Personer values(7,'Britt',7) insert into Personer values(8,'Magne',null) insert into Personer values(9,'Nils',null) og resultatet skal bli slik: Per EpleArne NULL Kåre NULL Lise Fisk Jonas Fisk Anne NULL Britt Fullkornsbrød Magne NULL Nils NULL Lenke til kommentar
bakrull Skrevet 5. oktober 2007 Del Skrevet 5. oktober 2007 (endret) Er temmelig ny i databaseverdenen, men denne gir i hvertfall riktig resultat: select p.navn, if(m.ersunt, m.matbeskrivelse, null) "SunnBeskrivelse" from personer p left join mat m on(p.favorittmat = m.matid); Endret 5. oktober 2007 av bakrull Lenke til kommentar
blackbrrd Skrevet 8. oktober 2007 Del Skrevet 8. oktober 2007 (endret) select p.navn, m.matbeskrivelse from personer p left join mat m on p.favorittmat = m.matid AND m.ersunt = 1; evt sånn - så lenge man putter AND m.ersunt = 1 på ON clausen av en LEFT JOIN fungerer det fortsatt som ett left join. Hvis du setter det på WHERE clausen fungerer LEF T JOINet ikke lenger som ett left-join, men effektivt som ett INNER JOIN Tror ikke dette blir så veldig pent uten å bruke LEFT JOIN.. ON Endret 8. oktober 2007 av blackbrrd Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå