Avatar billede cronick Nybegynder
23. januar 2007 - 16:22 Der er 11 kommentarer og
1 løsning

Inner join - ON kun hvis nødvendig

Hej,

jeg har denne lille "strimmel":
---------------------------------------
mysql_query("SELECT count(k.id) AS antalKommentare, sum(k.bedoem) AS antalVurderinger, a.* FROM minTabel1 AS a INNER JOIN minTabel2 AS k ON a.id = k.artikel_id $where $order $limit")or die(mysql_error());
---------------------------------------

Problemet er, at den kun henter fra "minTabel", hvis der eksisterer en række i minTabel2 med et artikel_id matchende til artiklens id. Den skulle helst kun gøre det, hvis der er sådan et match, og hvis ikke, så gøre det alligevel.. Er det muligt?

- På forhånd tak..
Avatar billede kalp Novice
23. januar 2007 - 16:30 #1
mysql_query("SELECT count(k.id) AS antalKommentare, sum(k.bedoem) AS antalVurderinger, a.* FROM minTabel1 AS a LEFT JOIN minTabel2 AS k ON a.id = k.artikel_id $where $order $limit")or die(mysql_error());

mysql_query("SELECT count(k.id) AS antalKommentare, sum(k.bedoem) AS antalVurderinger, a.* FROM minTabel1 AS a RIGHT JOIN minTabel2 AS k ON a.id = k.artikel_id $where $order $limit")or die(mysql_error());


klarer en af disse det?
Avatar billede coderdk Praktikant
23. januar 2007 - 19:43 #2
Prøv med LEFT OUTER JOIN :)
Avatar billede cronick Nybegynder
23. januar 2007 - 21:03 #3
Nu har jeg prøvet de 3 (left join, right join & left inner join), samt right inner join, og ingen af dem virker som de skal.. left inner join får siden til at fastfryse. Den når at hente cirka halvdelen af siden, og så stopper den bare og står fast. De tre andre virker bare på samme måde som min inner join..
Avatar billede coderdk Praktikant
23. januar 2007 - 22:48 #4
Prøvede du:

mysql_query("SELECT count(k.id) AS antalKommentare, sum(k.bedoem) AS antalVurderinger, a.* FROM minTabel1 AS a LEFT OUTER JOIN minTabel2 AS k ON a.id = k.artikel_id $where $order $limit")or die(mysql_error());
Avatar billede cronick Nybegynder
25. januar 2007 - 00:04 #5
Joeh, det virker. Men det tager siden 15 sek. at hente.. så ikke rigtig helt godt.. :)
Avatar billede coderdk Praktikant
25. januar 2007 - 01:21 #6
Det lyder som du skal have nogle indexer ;) Har du kørt en explain på den query?
Avatar billede coderdk Praktikant
25. januar 2007 - 01:22 #7
Ellers kan du dele den op i to - Først hente dem der HAR en record (med INNER JOIN) og så dem der ikke er med i første resultatsæt...
Avatar billede cronick Nybegynder
26. januar 2007 - 23:17 #8
Lyder interessant. Hvordan ville det se ud? (har ingen anelse)..
Avatar billede coderdk Praktikant
27. januar 2007 - 01:53 #9
Du ved hvordan du laver en inner join, så skal du bare lave et array med de ID'er, og lave en SELECT på den anden table med WHERE id NOT IN (1,2,3,4) osv
Avatar billede cronick Nybegynder
27. januar 2007 - 14:06 #10
Er stadig ikke helt med - vil du have jeg skal opdele det i to mysql-quries?
Avatar billede coderdk Praktikant
27. januar 2007 - 14:21 #11
Ja, enten del den op i to, eller analysér din SQL og tabeller og se om du kan opnå noget bedre med nogle andre indexer: http://www.databasejournal.com/features/mysql/article.php/1382791
Avatar billede cronick Nybegynder
23. juni 2007 - 13:04 #12
...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester