Zoek functie met verschillende tabbelen.
zal proberen zo duidelijk mogelijk te omschrijven.
Ik heb een 3 tabellen :
hoofd item1 tabel met verschillende details erbij.
tabel soort1
tabel soort2
De hoofd item1 kan verschillende soort1 hebben en verschillende soort2 hebben.
Voorbeeld : Item1 = soort1: geel, groen, blauw en soort2:rond vierkant
Nu wil ik een zoek functie maken waarbij gezocht kan worden op kleur en vorm.
Maar dat betekend dat als item1 rond en blauw is, deze maar 1 keer voorkomt in de result resultaten.
Maar hoe maak ik dat ? Door een inner join query te maken ?
Waar kan ik op zoeken?
Kan iemand mij helpen ?
Eerst maak je rijen met alle mogelijkheden.
Die filter je dan met:
Nu is soort1 en soort2 natuurlijk een waardeloze benaming, aangezien je alsnog niet weet wat het inhoudt.
Is er ook een soort3?
Of spreek je bewust zo abstract mogelijk zodat we er zo min mogelijk van snappen?
Daarnaast is een zin als 'ik heb een 3 tabellen' niet echt duidelijk. Heb je een (één) tabel? Of heb je drie tabellen?
Heel erg bedankt voor uw reactie.
Ik spreek bewust abstract omdat ik dacht dat het juist duidelijkheid gaf. Mijn excuus als dit juist voor onduidelijkheid zorg.
Probeer het nog een keer.
3 tabbellen.
Tabel 1 item1 Met detail informatie zoals afmetingen.
Tabel 2 soort1 Kleuren
Tabel 3 soort2 vorm
Tabel 1 RecId, itemnaam, maat,datum
Item1
Item2
Item3
Tabel 2 : RecId, itemid, kleur.
1,1, blauw
2,1, geel
3,2, groen.
4,3,geel
Tabel 3 : RecId, itemid, vorm.
1,1, rond
2,2, vierkant
3,3, ovaal.
4,1,vierkant
In zoeken gebeuren kan ik dus "filteren"
kleur en vorm met daarbij de resultaten van items.
is dit zo duidelijker ?
Toevoeging op 03/11/2014 17:21:56:
Code (php)
1
$data = mysql_query("SELECT * FROM item1 INNER JOIN soort1 ON item1.RecId=soort1.itemid INNER JOIN soort2 ON item1.RecId = soort2.itemid")
Als ik dit heb, krijg ik resultaat van alles. Maar niet als ik where erachter zet.
Toevoeging op 03/11/2014 19:22:06:
Ik heb nu dit :
Code (php)
1
$data = mysql_query("SELECT * FROM item1 INNER JOIN soort1 ON item1.RecId=soort1.itemid INNER JOIN soort2 ON item1.RecId = soort2.itemid where soort1 = 'blauw' OR soort2.vorm='vierkant' ")
Probleem : Als ik $row['RecId'] heb, dan pak ik die van soort1.
En niet van item.
Gewijzigd op 03/11/2014 16:21:18 door John Klavers
Bijv SELECT item1.RecId AS RecID, soort1.kleur AS kleur, soort2.vorm AS vorm etc.
Zat al aan zoiets te denken.
Alleen volgende probleem. het resultaat moet 4 items zijn. Maar krijg er maar 2 te zien.
Probeer eerst een volledige lijst te krijgen met alle mogelijke varianten van items wat betreft kleuren en vormen.
Nu zegt 'item' ook zeer weinig: gaat het om vazen?
Maar gaat om deuren, bepaald soort hout en vorm raam.
Union gaat toch niet werken ? de tabbellen zijn niet gelijk toch?
Als ik 1 join doe dan gaat wel goed
Code (php)
1
$data = mysql_query("SELECT * FROM item1 INNER JOIN soort1 ON item1.RecId=soort1.itemid where soort1 = 'blauw'")
krijg ik 3 resultaten.
doe ik
Code (php)
1
$data = mysql_query("SELECT * FROM item1 INNER JOIN soort1 ON item1.RecId=soort1.itemid INNER JOIN soort2 ON item1.RecId = soort2.itemid where soort1 = 'blauw' OR soort2.vorm='vierkant' ")
krijg ik 5 resultaten en mis ik er 2.
Ik begrijp niet hoe je met de 1e query 3 resultaten kun krijgen als de tabellen zijn zoals je in begin opgeeft (op 3/11 15:17).
Er is enkel Item1 in blauw. En dan in rond en vierkant. Dus 2 resultaten.
Deze query werkt volgens mij toch al niet zo, omdat soort1 = 'blauw' moet zijn soort1.kleur = 'blauw'.
De 2e query zou maar 1 resultaat mogen opleveren. En geen 7.
Hoe kom jij aan 7?
Jan
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Tabel 1 deur - RecId, titel, tekst,hoogte, lengte, breed, klinkhoogte, foto.
Tabel 2 soorthout - RecId deurid, hout
Tabel 3 raam - RecId,deurid, vorm
Tabel 1 : RecId, titel, hoogte, lengte, breed, klinkhoogte, afmeting.
1,deur1,deur1.jpg
2,deur2,deur2.jpg
3,deur3,deur3.jpg
4,deur4,deur4.jpg
5,deur5,deur5.jpg
En verder
Tabel 2 : RecId deurid, hout
1,3,grenen
2,2,douglas
3,5,grenen
4,4,vuren
5,5,eiken
6,6,grenen
Tabel 3 : RecId, itemid, vorm.
1,1, vierkant
2,4, vierkant
4,5,paralel rechthoekig
5,2, vierkant.
Tabel 2 soorthout - RecId deurid, hout
Tabel 3 raam - RecId,deurid, vorm
Tabel 1 : RecId, titel, hoogte, lengte, breed, klinkhoogte, afmeting.
1,deur1,deur1.jpg
2,deur2,deur2.jpg
3,deur3,deur3.jpg
4,deur4,deur4.jpg
5,deur5,deur5.jpg
En verder
Tabel 2 : RecId deurid, hout
1,3,grenen
2,2,douglas
3,5,grenen
4,4,vuren
5,5,eiken
6,6,grenen
Tabel 3 : RecId, itemid, vorm.
1,1, vierkant
2,4, vierkant
4,5,paralel rechthoekig
5,2, vierkant.
Krijg 3 resultaten bij deze query
Code (php)
1
$data = mysql_query("SELECT deur.RecId as deurid,deur.titel,deur.foto,deur.tekst FROM deur inner JOIN soorthout ON deur.RecId=soorthout.deurid where soorthout.hout = 'grenen'")
recid van deur : 5 3 en 6
doe ik innerjoin beide :
Code (php)
1
$data = mysql_query("SELECT deur.RecId as deurid,deur.titel,deur.foto,deur.tekst FROM deur inner JOIN soorthout ON deur.RecId=soorthout.deurid INNER JOIN raam ON deur.RecId = raam.deurid where soorthout.hout = 'grenen' OR raam.vorm='vierkant'")
recid van deur 5 4 en 2
ik mis dus 3 en 6
Excuus voor onduidelijkheid. Is het zo duidelijker :)?
Heel erg bedankt alvast voor meedenken!
Gewijzigd op 05/11/2014 15:18:29 door John Klavers
Verder begrijp ik niet waarom je deur 2 krijgt, want die is parallel rechthoekig. Ik zou verwachten dat je deur 1 krijgt.
Deur 6 komt niet in je tabel deur voor, dus ook raar dat je die bij je 1e query krijgt. Maar dat kan een foutje in je voorbeeld zijn. Want deurid 6 heeft wel een houtsoort, maar geen deur en geen vorm.
ik krijg 5 4 en 2 door.
2 snap ik niks van.
6 stond er wel in maar had ik hier niet op gezet, sorry.
dus ik krijg er 2 niet door, en 1 die er niet thuis hoor.
Gewijzigd op 05/11/2014 14:32:52 door Jan de Laet
Code (php)
1
$data = mysql_query("SELECT deur.RecId as deurid,deur.titel,deur.foto,deur.tekst,soorthout.hout en raam.vorm FROM deur inner JOIN soorthout ON deur.RecId=soorthout.deurid INNER JOIN raam ON deur.RecId = raam.deurid where soorthout.hout = 'grenen' OR raam.vorm='vierkant'")
nog steeds zelfde.
5,4,2
@edit heb een fout gemaakt, 2 hoor er wel tussen. Ik had naar de recid gekeken. dacht dat 5 2 keer moest voorkomen.
1 opgelost, alleen 1 en 6 laat hij nog niet zien.
misschien dat er fout word gemaakt met : deur.RecId as deurid ?
Gewijzigd op 05/11/2014 14:46:38 door John Klavers
Maar laat dan de output eens zien.
Misschien dat het helpt als je haakjes gebruikt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
deur.RecId as deurid,
deur.titel,
deur.foto,
deur.tekst,
soorthout.hout,
raam.vorm
FROM deur
INNER JOIN soorthout ON deur.RecId = soorthout.deurid
INNER JOIN raam ON deur.RecId = raam.deurid
WHERE (soorthout.hout = 'grenen') OR (raam.vorm = 'vierkant')
deur.RecId as deurid,
deur.titel,
deur.foto,
deur.tekst,
soorthout.hout,
raam.vorm
FROM deur
INNER JOIN soorthout ON deur.RecId = soorthout.deurid
INNER JOIN raam ON deur.RecId = raam.deurid
WHERE (soorthout.hout = 'grenen') OR (raam.vorm = 'vierkant')
Gewijzigd op 05/11/2014 14:48:28 door Jan de Laet
Output in php code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while($row = mysql_fetch_array($data)){
echo '><';
$newline ='';
if(($i+0) % 4 === 0) $newline = ' newline';
echo '<a class="itube" title="" href="deur.php?deur='.$row['deurid'].'">
<div class="lijn '.$newline.'">
<img src="fotos/'.$row['foto'].'" alt="'.$row['titel'].'" title="'.$row['titel'].'"/>
<h2>'.$row['titel'].' - '.$row['hout'].'</h2>
<p>'.$row['tekst'].'</p>
</div>
</a>';
echo '><';
$newline ='';
if(($i+0) % 4 === 0) $newline = ' newline';
echo '<a class="itube" title="" href="deur.php?deur='.$row['deurid'].'">
<div class="lijn '.$newline.'">
<img src="fotos/'.$row['foto'].'" alt="'.$row['titel'].'" title="'.$row['titel'].'"/>
<h2>'.$row['titel'].' - '.$row['hout'].'</h2>
<p>'.$row['tekst'].'</p>
</div>
</a>';
en ik kijk dan vooral naar de link. deur= 5 4 en 1.
Mis dus 2 en 6 op 1 of andere manier.
Ik moet wel iets fout doen lijk me.
Kijk ook even of de data in vorm correct is.
Bij deur 2 zie ik vierkant. als die punt er staat vind je hem niet
Deur 6 heeft geen vorm record dus daarom zie je die ook niet.
Dit komt door je INNER JOIN, dan moet het record er zijn.
Ik begrijp niet waarom je 4 en 1 wel ziet. Deur 4 heeft lege vorm en Deur 1 heeft geen houtsoort.
Deur 6 heeft wel een hout soort grenen waar op gezocht word, dus die moet toch getoond worden ?
Door mijn fout van recid en vorm id heb ik die geedit en in slordigheid 4 leeggehaald. sorry.
deur 1 heeft wel een raam vorm.
Kan ik uit je tekst opmaken dat er bij soort hout en vorm beide ingevuld moeten zijn wil je het in de resulaat zien?
Als ik sql invoer bij phpmyadmin is dit resultaat :
deurid titel foto tekst soorthout vorm
5 test 4.jpg grenen, privefeest
4 test 4.jpg vuren, vierkant
2 test 4.jpg douglas, vierkant
missing : 1 en 6 na mijn idee.
tabellen nog keer correct
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Tabel 1 deur - RecId, titel, tekst,hoogte, lengte, breed, klinkhoogte, foto.
Tabel 2 soorthout - RecId deurid, hout
Tabel 3 raam - RecId,deurid, vorm
Tabel 1 : RecId, titel, hoogte, lengte, breed, klinkhoogte, afmeting.
1,deur1,deur1.jpg
2,deur2,deur2.jpg
3,deur3,deur3.jpg
4,deur4,deur4.jpg
5,deur5,deur5.jpg
En verder
Tabel 2 : RecId deurid, hout
1,3,grenen
2,2,douglas
3,5,grenen
4,4,vuren
5,5,eiken
6,6,grenen
Tabel 3 : RecId, itemid, vorm.
1,1, vierkant
2,4, vierkant
4,5,paralel rechthoekig
5,2, vierkant
Tabel 2 soorthout - RecId deurid, hout
Tabel 3 raam - RecId,deurid, vorm
Tabel 1 : RecId, titel, hoogte, lengte, breed, klinkhoogte, afmeting.
1,deur1,deur1.jpg
2,deur2,deur2.jpg
3,deur3,deur3.jpg
4,deur4,deur4.jpg
5,deur5,deur5.jpg
En verder
Tabel 2 : RecId deurid, hout
1,3,grenen
2,2,douglas
3,5,grenen
4,4,vuren
5,5,eiken
6,6,grenen
Tabel 3 : RecId, itemid, vorm.
1,1, vierkant
2,4, vierkant
4,5,paralel rechthoekig
5,2, vierkant
Quote:
Kan ik uit je tekst opmaken dat er bij soort hout en vorm beide ingevuld moeten zijn wil je het in de resulaat zien?
Ja dat is zo, komt door de INNER JOIN.
Als je dat niet kunt gebruiken omdat soms houtsoort of vorm niet aanwezig zijn, moet je LEFT OUTER JOIN gebruiken. Die geeft dan NULL in hout of vorm als het niet voorkomt, dus dat zul je dan ook mee moeten nemen in je WHERE, bijv WHERE soorthout.hout in ('grenen', NULL).
Vwb je resultaat:
Deur 5 klopt want die heeft grenen (en heeft een vorm)
Deur 4 klopt want die is vierkant (en heeft een soorthout)
Deur 2 klopt want die is vierkant (en heeft een soorthout)
Deur 1 heeft geen houtsoort
Deur 3 heeft geen vorm
enz
damn blij.
*maak even een dansje*
Nu nog de prijs range erin voegen.
Heb ook al getest als je alleen op vorm zoek. Dan geeft hij er 3 weer.
En kan ik zo eeuwig tabbelen erbij voegen met left join?
Heel heel heel erg bedankt!
voor uw geduld, uitleg en hulp.
Als je dan nog even je uiteindelijke sqls hier toont, dan hebben anderen er ook nog wat aan.
Zal ik ook gelijk klein tutorial van maken ? verschil tussen left join en inner join en hoe je meerdere tabbellen 1 resultaat kan maken ?