Zoek functie met verschillende tabbelen.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

John Klavers

John Klavers

03/11/2014 13:56:08
Quote Anchor link
Beste medefora mensen,

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 ?
 
PHP hulp

PHP hulp

16/11/2024 19:58:58
 
Eddy E

Eddy E

03/11/2014 14:22:20
Quote Anchor link
Inderdaad met wat joins.
Eerst maak je rijen met alle mogelijkheden.
Die filter je dan met:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
WHERE soort1 = '".$vorm."'
AND soort2 = '".kleur."'


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?
 
John Klavers

John Klavers

03/11/2014 15:17:41
Quote Anchor link
Beste Eddy,

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)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
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
 
Jan de Laet

Jan de Laet

04/11/2014 16:19:09
Quote Anchor link
$row['RecId'] kun je oplossen door na de SELECT de velden te (her)noemen die je nodig hebt.
Bijv SELECT item1.RecId AS RecID, soort1.kleur AS kleur, soort2.vorm AS vorm etc.
 
John Klavers

John Klavers

04/11/2014 21:58:19
Quote Anchor link
Bedankt dat helpt.
Zat al aan zoiets te denken.
Alleen volgende probleem. het resultaat moet 4 items zijn. Maar krijg er maar 2 te zien.
 
Eddy E

Eddy E

04/11/2014 22:06:16
Quote Anchor link
In plaats van een INNER JOIN, wat gebeurt er als je een UNION JOIN gebruikt?

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?
 
John Klavers

John Klavers

05/11/2014 11:03:26
Quote Anchor link
Ik dacht een algemeen iets te maken zodat ik voor algemeen kan gebruiken.
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)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
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.
 
Jan de Laet

Jan de Laet

05/11/2014 13:01:23
Quote Anchor link
John,

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
 
John Klavers

John Klavers

05/11/2014 13:43:45
Quote Anchor link
na 3 dagen testen en proberen heb ik de tabel uitgebreid :).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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.


Krijg 3 resultaten bij deze query
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
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
 
Jan de Laet

Jan de Laet

05/11/2014 13:56:00
Quote Anchor link
In je 2e query zit een fout: soorthout.deurid = 'grenen' moet zijn soorthout.hout = 'grenen'

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.
 
John Klavers

John Klavers

05/11/2014 14:20:42
Quote Anchor link
Deur id hoor inderdaad hout te zijn, gecorrigeerd.

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.
 
Jan de Laet

Jan de Laet

05/11/2014 14:30:26
Quote Anchor link
Breid je sqls eens uit met in de select ook soorthout.hout en raam.vorm (hout alleen in de 1e en beide in de 2e) en laat je volledige resultaten eens zien.
Gewijzigd op 05/11/2014 14:32:52 door Jan de Laet
 
John Klavers

John Klavers

05/11/2014 14:43:33
Quote Anchor link
zo bedoel je ?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
 
Jan de Laet

Jan de Laet

05/11/2014 14:47:54
Quote Anchor link
Bijna: "en raam.vorm" moet natuurlijk ", raam.vorm" zijn, dus komma ipv en.

Maar laat dan de output eens zien.
Misschien dat het helpt als je haakjes gebruikt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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')
Gewijzigd op 05/11/2014 14:48:28 door Jan de Laet
 
John Klavers

John Klavers

05/11/2014 14:55:23
Quote Anchor link
met haakjes helpt niet.

Output in php code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>';


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.
 
Jan de Laet

Jan de Laet

05/11/2014 15:10:30
Quote Anchor link
Met output bedoel ik het resultaat van de sql statements. Vanuit PHPMyadmin of iets dergelijks waar je de select uitvoert.

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.
 
John Klavers

John Klavers

05/11/2014 15:29:40
Quote Anchor link
Bij deur 2 zie ik vierkant. als die punt er staat vind je hem niet < die punt heb ik er automatische bijgezet, die staat natuurlijk niet in de tabel
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)
PHP script in nieuw venster Selecteer het PHP script
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
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
 
Jan de Laet

Jan de Laet

05/11/2014 15:40:40
Quote Anchor link
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
 
John Klavers

John Klavers

05/11/2014 15:51:21
Quote Anchor link
YES :D het is gelukt :).
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.
 
Jan de Laet

Jan de Laet

05/11/2014 16:38:02
Quote Anchor link
Mooi, graag gedaan en succes verder.

Als je dan nog even je uiteindelijke sqls hier toont, dan hebben anderen er ook nog wat aan.
 
John Klavers

John Klavers

05/11/2014 18:32:23
Quote Anchor link
natuurlijk wil ik dat doen.
Zal ik ook gelijk klein tutorial van maken ? verschil tussen left join en inner join en hoe je meerdere tabbellen 1 resultaat kan maken ?
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.