login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Zoeken in 8 tabellen (Opgelost)

Offline xSc - 15/02/2007 17:14
Avatar van xScOnbekend Heb 'n db aangeleverd gekregen met een aantal tabellen. In alle 8 tabellen staat een koppeling met de stamtabel (klantid) en kolom 'pnummer'. Nu heb ik een zoekformulier waarin ik naar een pnummer wil zoeken waarvan ik niet van te voren weet in welke tabel dat nr staat.

Ik krijg nu zo enorm veel vergelijkingen dat alles vastloopt. Toch wil men het zo. Wat doe ik hieraan?

14 antwoorden

Gesponsorde links
Offline ikkedikke - 15/02/2007 17:17
Avatar van ikkedikke PHP expert De databasestructuur is niet te normaliseren?
Als het goed is kan mysql in 60(oid) tabellen tegelijk kijken.
Als je de structuur even laat weten kan ik misschien wel een query maken.
Offline gothmog - 15/02/2007 17:24
Avatar van gothmog Lid Misschien een script tonen? Of iig een stuk ervan?
Misschien kunnen we een fout ontdekken...
Offline xSc - 15/02/2007 18:41 (laatste wijziging 15/02/2007 19:03)
Avatar van xSc Onbekend
Citaat:
Als het goed is kan mysql in 60(oid) tabellen tegelijk kijkenp


Dat begrijp ik natuurlijk ook, maar mijn probleem ligt anders:


het gaat om het aantal vergelijkingen:

........ WHERE (stamtabel.klant_id = tabel1.klant_id AND tabel1.pnummer = 'ingevoerdewaarde') OR (stamtabel.klant_id = tabel2.klant_id AND tabel2.pnummer = 'ingevoerdewaarde') OR ........ t/m tabel9

pnummer komt altijd maar in 1 van de 9 tabellen voor. Duizenden vergelijkingen dus. Ik heb al indexes geprobeerd, maar ik bemerk geen verbetering.

Normaliseren kost veel te veel tijd. Begrijp me goed, ik normaliseer normaalgesproken altijd! Deze database heb ik echter aangeleverd gekregen!

Er zit geen fout in de query.
Offline vinTage - 15/02/2007 19:10
Avatar van vinTage Nieuw lid Sorry als ik iets onnozels zeg, maar gaat dat niet gewoon met like, of match en against ?
Dan zijn je resultaten toch al een stuk kleiner?
Offline xSc - 15/02/2007 19:14
Avatar van xSc Onbekend VinTage, daar gaat het even niet om ....

Het gaat om het aantal vergelijkingen. Ik moet dus alle 9 tabellen vergelijken of daar het nr in voorkomt, LIKE even buiten beschouwing gelaten.
Offline ikkedikke - 15/02/2007 19:34
Avatar van ikkedikke PHP expert Wat moet je hebben? het klantenID?
dan kan je het volgende proberen:
SELECT `klantenID` FROM `klanten` WHERE `klanten`.`klantenID` IN(SELECT `tabel1`.`klantenID`, `tabel2`.`klantenID` FROM `tabel1`,`tabel2` WHERE `tabel1`.`pnummer `= '$pnummer' OR `tabel2`.`pnummer `= '$pnummer')
Offline xSc - 15/02/2007 22:43
Avatar van xSc Onbekend Ikkedikke, dat is een aardig idee. Maar volgens mij ondersteunt die MySQL versie geen subqueries ....
Offline raza - 15/02/2007 23:51
Avatar van raza HTML beginner zijn er mysql versies die geen subqueries ondersteunen? :/
Offline Gerard - 16/02/2007 00:27 (laatste wijziging 16/02/2007 00:32)
Avatar van Gerard Ouwe rakker MySQL ondersteunt subqueries vanaf 4.1 als ik het goed heb.
Offline Ultimatum - 16/02/2007 07:12
Avatar van Ultimatum PHP expert Aanvulling op hieboven 

Citaat:
A subquery is a SELECT statement within another statement.

Starting with MySQL 4.1, all subquery forms and operations that the SQL standard requires are supported, as well as a few features that are MySQL-specific


Maar ook als je gewoon in select maakt waar je alle id's aan elkaar koppelt dan heb je toch maar 1 grote query, maar dan kun je wel in alle tabellen zoeken..
Offline Thomas - 16/02/2007 09:36
Avatar van Thomas Moderator Ga uit van een tabel waarvan je weet dat er gegevens in staan, en gebruik dan LEFT JOINs?
Als je alles aan elkaar hangt met WHERE ... AND ... AND ... AND ... en één van die tabellen is leeg, dan heb je ook geen resultaat.

Bij LEFT JOINs wel . Je hebt dan wss wel veel kolommen met NULL erin, maar je resultaat-rijen worden dan niet in het geheel weggegooid.
Offline xSc - 16/02/2007 10:53 (laatste wijziging 16/02/2007 11:00)
Avatar van xSc Onbekend FangorN 

Ik heb het ook geprobeerd met LEFT JOINS, maar 1 tabel heb ik sowieso in de WHERE nodig voor een andere vergelijking. Verder is het niet zo dat ik geen resultaat heb:


...... WHERE ..... AND ((stamtabel.kolom1 = tabel1.kolom1 AND tabel1.kolom2 = 'nummer') OR (stamtabel.kolom1 = tabel2.kolom1 AND tabel2.kolom2 = 'nummer') ..... )

Tussen WHERE ..... AND staan andere vergelijkingen. De server loopt echter vast (query blijft hangen).

LEFT JOINS zijn niet sneller ...
Offline Thomas - 16/02/2007 11:17
Avatar van Thomas Moderator De query blijft hangen? Gaat het om een heleboel records dan?
Je moet van een tabel uitgaan - deze zet je dan in het WHERE-deel, de rest zet je in JOINs.

Waarom splits je het niet op in meerdere queries?

Je zou ook eens kunnen kijken naar de efficiency van de query door EXPLAIN voor je query te zetten. Als bepaalde JOINs (in wat voor vorm dan ook) nogal "complex" zijn, dan loont het misschien de moeite om indexen aan te brengen op de tabellen die je probeert te joinen.

Zie ook Optimizing MySQL: Queries and Indexes.
Offline xSc - 16/02/2007 11:43
Avatar van xSc Onbekend FangorN, ik heb ik wel indexes gezet op de velden die ik mijn zoekopdrachten nodig had. Ik vraag me wel af of het tijdswinst oplevert om LEFT JOINS te gebruiken. Ik durf het niet uit te testen omdat misschien de query weer blijft hangen, waarna een herstart noodzakelijk is. Met LEFT JOIN moeten ook alle mogelijke combinaties worden nagegaan. Ik heb het nu opgelost door een extra formulierveld, waarin aangegeven wordt om welke tabel het gaat. Dan werkt het supersnel.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.181s