Hallo ik ben met een lastige query bezig en kom er niet meer uit.

De tabellen zien er ongeveer zo uit:

Tabel 1 naam: een

een_id getal1 getal2 getal3 getal4 getal5 getal6
-------------------------------------------------------
44 21 22 23 47 84 98
45 22 45 47 42
46 11 41 21 45
47 22
48 84 45 21

Tabel 2 naam: twee

twee_id Naam Bedrijf tel een_id
---------------------------------------------------
1 Henks Mooi 0124 21
2 frits groot 7178 48
3 Roel Klein 7431 47
4 Gekkie stom 7442 22

Okee uitleg:
Ik wil graag wanneer je een bedrijf zoekt moet 'een_id' : 48 dat je dan ook de bedrijven vindt met de id's die horen bij een_id 48.

In dit geval wanneer ik zou zoeken op 48 zou ik de bedrijven 'frits' & 'Henks'moeten vinden.

De query die ik nu gebruik (werkt wel maar verkeerde uitslag) is dit:

<?php
SELECT * FROM een, twee WHERE (een.een_id = 48 AND twee.twee_id = 48 OR twee.een_id =
een.getal1 OR twee.een_id = een.getal2 OR twee.een_id = een.getal3 OR
twee.een_id = een.getal4 OR twee.een_id = een.getal5 OR twee.een_id = een.getal6 )
?>

Met deze query krijg ik heel veel bedrijven, ook zitten hier veel dubbelen bij. Het word een zoek query om bedrijven te vinden. Nu heeft elk bedrijf een 'een_id'
Maar ik wil hebben dat het bedrijf ook op een aantal andere een_id's word gevonden.

Daarom heb ik een extra tabel gemaakt waar ik bepaalde een_id's aan elkaar koppel. Ik moet in de
query er nu voor zorgen dat wanneer op 48 word gezocht ook de bedrijven vindt die 84, 45 of 21 als een_id hebben.

Ik heb overal al lopen zoeken maar zit echt vast nu. Ik had dit al eerder gepost, toen is er niks uitgekomen omdat men dacht dat de database niet goed was genormaliseerd. De database kan niet anders en is correct genormaliseerd. Ik wou graag weten hoe ik een dergelijke query kan maken.

Mvg,
Roel
Jah.. De echte tabel is ook een stuk groter (tot getal 33)! Je koppelt geen bedrijven aan elkaar. Ik koppel nummers aan elkaar. En een nummer koppel ik weer aan een bedrijf. Een bedrijf kan maar 1 nummer hebben, en in tabel "een" koppel ik deze aan andere nummers.

Ik weet dat het ingewikkeld klinkt (en omslachtig), maar als ik de hele database hier neer zou leggen werd het een grote post :P

Daarom zou ik graag een hebben dat mijn vraag werd beandwoord (de query :P) en niet of de database nu wel of niet goed in elkaar zit..
roel schreef op 05.01.2006 10:15
getal1 getal2 getal3 getal4 getal5 getal6 zijn vaste gegevens. Deze zijn niet gekoppeld aan 1 bedrijf. Meerdere bedrijven kunnen het zelfde gegeven hebben.

Jan Koehoorn: Ik krijg deze error met je query:

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /usr/home/------/domains/-------/public_html/bedrijftest.php on line 23

Dus de query lijkt niet goed te zijn..


Echo de query eens naar je scherm? Wat krijg je dan te zien?
Ok ok....
Als ik zeg dat ik een bedrijf aan een bedrijf koppel, dan bedoel duidelijk niet de naam van het bedrijf, maar het id van de bedrijf (het nummer dus).

-----------------------------------------------------
Op die manier word de database groot & traag omdat wel duizend bedrijven hetzelfde "een_id" kunnen hebben.
-----------------------------------------------------
Dus niet.... bij mijn manier heb je maar 2 velden.
Wat dus veel sneller te doorzoeken is.
Ook zijn de queries in dit geval makkelijker te schrijven.


-----------------------------------------------------
Jah.. De echte tabel is ook een stuk groter (tot getal 33)!
-----------------------------------------------------
Je geeft nu zelf al aan dat de tabel van jou zelf ook al een stuk groter is.
Je zult nu ook veel lege velden krijgen wanneer je bijvoorbeeld een bedrijf maar aan 1 bedrijf koppelt, voor lege velden wordt enigzins ook ruimte voor gereserveerd.


Neem van mij aan dat die database van jou niet goed is genormaliseerd.
Tevens zal het langzamer gaan werken wanneer er veel gegevens in komen te staan.
Je hebt nu al problemen met het schrijven van queries, omdat de manier waarop je nu werkt nogal omslachtig is.
Elke keer dat je een record aanmaakt reserveer je ruimte voor 33 velden. Het is zonde dat je al die ruimte in jou geval niet zal gaan gebruiken.

Mijn methode is gewoon simpeler, sneller en makkelijker uit te breiden. Het maakt niet uit of je een bedrijf dan aan 1 of aan 1000 andere bedrijven koppelt.... je hebt in dat geval geen lege velden. Tevens is het schrijven van een query voor mijn tabel een stuk makkelijker.


Maar ja, van mij mag je lekker doorwerken zoals je nu werkt.
Ik ben niet de eerste die heeft gezegd dat die database van jou niet goed genormaliseerd is.
Ik mag hopen dat je er later zelf ook achterkomt.
(je merkt het nu al bij het schrijven van queries, later bij de database performance).


Ok.... succes er mee

ps: gebruik een GROUP BY in je query als dubbele gegevens wilt vermijden.
IK doen het meestal zo

<?php
SELECT een.*, twee.*
FROM een, twee
WHERE (
een.een_id = 48 AND
(twee.twee_id = 48 OR
twee.een_id = een.getal1 OR
twee.een_id = een.getal2 OR
twee.een_id = een.getal3 OR
twee.een_id = een.getal4 OR
twee.een_id = een.getal5 OR
twee.een_id = een.getal6))
?>
Klaasjan schreef op 05.01.2006 11:05
IK doen het meestal zo

<?php
SELECT een.*, twee.*
FROM een, twee
WHERE (
een.een_id = 48 AND
(twee.twee_id = 48 OR
twee.een_id = een.getal1 OR
twee.een_id = een.getal2 OR
twee.een_id = een.getal3 OR
twee.een_id = een.getal4 OR
twee.een_id = een.getal5 OR
twee.een_id = een.getal6))
?>


THX dude deze werkt perfect!
Omdat ik toch zo graag wil helpen :-)
Maar helaas niet op de manier die ik had gehoopt :-(

Even uit mijn hoofd, dus ik weet niet zeker of het werkt.

<?php
SELECT naam
FROM twee
WHERE
een_id IN
(SELECT getal1, getal2, ....
FROM een
WHERE een_id = 48)
?>
Ok..... probleem al opgelost dus

mooi :-)

Reageren