Hallo,

Ik heb een drietal tabellen met allen vergelijkbare gegevens, deze gegevens moeten in aprate tabellen blijven, omdat het klantgegevens zijn van aparte onderaannemers binnen ons bedrijf.
Ik heb tot nu toe de tabellen samengevoegd met UNION ALL, maar wil dit nu doen met JOIN, zodat mijn SQL-statement een stuk korter wordt en dat scheelt weer in de grootte van mijn script.
Ik heb het volgende geprobeerd, maar ik kom er niet uit, hij geeft nl. geen resultaten.. Ik krijg de volgende foutmelding:

Notice: Column 'debnr' in where clause is ambiguous in W:\Web\Login\Algemeen\DB\debiteur.php on line 380

welke betrekking heeft op mysql_query($sql);

<?php
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
             debiteur_ts.debnr, debiteur_ts.debnaam, debiteur_ts.postadres, debiteur_ts.locadres, debiteur_ts.wplaats,   
             debiteur_bs.debnr, debiteur_bs.debnaam, debiteur_bs.postadres, debiteur_bs.locadres, debiteur_bs.wplaats, 
             debiteur_bsu.debnr, debiteur_bsu.debnaam, debiteur_bsu.postadres, debiteur_bsu.locadres, debiteur_bsu.wplaats
        FROM 
			debiteur_bs 
		INNER JOIN 
			debiteur_ts 
		INNER JOIN 
			debiteur_bsu
        WHERE (            
                TRIM(debnr) NOT LIKE ''
        ORDER BY debnr" or trigger_error(mysql_error());
?>


deze gegevens moeten in aprate tabellen blijven, omdat het klantgegevens zijn van aparte onderaannemers binnen ons bedrijf.
Nee, dat is helemaal nergens voor nodig. Ga gewoon normaliseren: maak een tabel met daarin de onderaannemers en link de tabel debiteur aan het juiste id. Daar zijn foreignkeys voor uitgevonden.

Kortom, bovenstaand probleem is opgelost!

Of eigenlijk, ga eerst een goed datamodel maken en dan pas verder.

Edit: Of ga jij soms het hele systeem aanpassen omdat er een onderaannemer bijkomt? Lijkt mij niet en ik mag ook hopen van niet. Het zou niet best zijn wanneer dit soort fratsen nodig zijn bij nieuwe klanten, onderaannemers en ik weet niet wat nog meer.
Je moet een alias aanmaken bij deze foutemelding in meerdere tabelen komt de kolom debnr voor. Dus

<?php
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
debiteur_ts.debnr, debiteur_ts.debnaam, debiteur_ts.postadres, debiteur_ts.locadres, debiteur_ts.wplaats,
debiteur_bs.debnr, debiteur_bs.debnaam, debiteur_bs.postadres, debiteur_bs.locadres, debiteur_bs.wplaats,
debiteur_bsu.debnr, debiteur_bsu.debnaam, debiteur_bsu.postadres, debiteur_bsu.locadres, debiteur_bsu.wplaats
FROM
debiteur_bs
INNER JOIN
debiteur_ts
INNER JOIN
debiteur_bsu
WHERE (
TRIM(hierdejuistetabel.debnr) NOT LIKE ''
ORDER BY hierdejuistetabel.debnr" or trigger_error(mysql_error());
?>

op zich weet google dit ook wel hoor
[edit]
Ik ben het overigens wel met FRank eens dat je model ruk is. Zoals je ook al ziet aan het feit dat je UNION gebruikt. Eigenlijk als je meer dan eens dezelfde sql maakt moet je je al afvragen of je datamodel wel juist is [/edit]
je moet je tabel ervoor zetten
dus:
debuteur_bs.debnr of
debuteur_ts.debnr of
debuteur_bsu.debnr.

Ik denk dat je hem dan hebt. Anders hoor ik het wel!
de reden dat wij drie verschillende tabellen gebruiken is omdat wij de gegevens exporteren uit Exact. Hierbij kunnen wij geen foreign key meegeven.. :)
ik heb nu:

<?php
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
             debiteur_ts.debnr, debiteur_ts.debnaam, debiteur_ts.postadres, debiteur_ts.locadres, debiteur_ts.wplaats,   
             debiteur_bs.debnr, debiteur_bs.debnaam, debiteur_bs.postadres, debiteur_bs.locadres, debiteur_bs.wplaats, 
             debiteur_bsu.debnr, debiteur_bsu.debnaam, debiteur_bsu.postadres, debiteur_bsu.locadres, debiteur_bsu.wplaats
        FROM 
			debiteur_bs 
		INNER JOIN 
			debiteur_ts 
		INNER JOIN 
			debiteur_bsu
        WHERE debiteur_ts.debnr NOT LIKE '' AND
                   debiteur_bs.debnr NOT LIKE '' AND
                   debiteur_bsu.debnr NOT LIKE '' 
        ORDER BY debiteur_ts.debnr,debiteur_bs.debnr,debiteur_bsu.debnr";
?>


Alleen de laadtijd is ontieglijk lang nu.. en daardoor geeft hij dus nu ook een CGI timeout
Wout schreef op 22.06.2007 11:59
de reden dat wij drie verschillende tabellen gebruiken is omdat wij de gegevens exporteren uit Exact. Hierbij kunnen wij geen foreign key meegeven.. :)
Ok, Exact kun je dan misschien niet aanpassen, maar jouw importscript kun je wel aanpassen. En dat is waarschijnlijk, zeker met het oog op de toekomst, eenvoudiger.
$sql = " EXPLAIN SELECT
debiteur_ts.debnr, debiteur_ts.debnaam, debiteur_ts.postadres, debiteur_ts.locadres, debiteur_ts.wplaats,
debiteur_bs.debnr, debiteur_bs.debnaam, debiteur_bs.postadres, debiteur_bs.locadres, debiteur_bs.wplaats,
debiteur_bsu.debnr, debiteur_bsu.debnaam, debiteur_bsu.postadres, debiteur_bsu.locadres, debiteur_bsu.wplaats
FROM
debiteur_bs
INNER JOIN
debiteur_ts
INNER JOIN
debiteur_bsu
WHERE debiteur_ts.debnr NOT LIKE '' AND
debiteur_bs.debnr NOT LIKE '' AND
debiteur_bsu.debnr NOT LIKE ''
ORDER BY debiteur_ts.debnr,debiteur_bs.debnr,debiteur_bsu.debnr";
?>

doe dat eens

[edit]
al eens ANALYZE en OPTIMIZE gebruikt?
[/edit]
Ik heb nu dat laatste toegepast en krijg nu 3 resultaten, terwijl ik voorheen 77 resultaten kreeg..
Ik heb mijn $sql even ge-eachoot en dit kreeg ik als output:
terwijde:
Mijn WHERE clausule was voorheen een voorbeeld, in het volgende krijg je de echte WHERE statement te zien.

$sql:

EXPLAIN SELECT debiteur_ts.debnr, debiteur_ts.debnaam, debiteur_ts.postadres, debiteur_ts.locadres, debiteur_ts.wplaats, debiteur_bs.debnr, debiteur_bs.debnaam, debiteur_bs.postadres, debiteur_bs.locadres, debiteur_bs.wplaats, debiteur_bsu.debnr, debiteur_bsu.debnaam, debiteur_bsu.postadres, debiteur_bsu.locadres, debiteur_bsu.wplaats FROM debiteur_ts INNER JOIN debiteur_bs INNER JOIN debiteur_bsu WHERE (TRIM(debiteur_ts.debnr) LIKE '%berg%' OR TRIM(debiteur_bs.debnr) LIKE '%berg%' OR TRIM(debiteur_bsu.debnr) LIKE '%berg%' OR TRIM(debiteur_ts.debnaam) LIKE '%berg%' OR TRIM(debiteur_bs.debnaam) LIKE '%berg%' OR TRIM(debiteur_bsu.debnaam) LIKE '%berg%' OR TRIM(debiteur_ts.locadres) LIKE '%berg%' OR TRIM(debiteur_bs.locadres) LIKE '%berg%' OR TRIM(debiteur_bsu.locadres) LIKE '%berg%' OR TRIM(debiteur_ts.wplaats) LIKE '%berg%' OR TRIM(debiteur_bs.wplaats) LIKE '%berg%' OR TRIM(debiteur_bsu.wplaats) LIKE '%berg%' ) AND ( TRIM(debiteur_ts.debnr) NOT LIKE '1' AND TRIM(debiteur_ts.debnr) NOT LIKE '2' AND TRIM(debiteur_ts.debnr) NOT LIKE '20' AND TRIM(debiteur_ts.debnr) NOT LIKE '30' AND TRIM(debiteur_bs.debnr) NOT LIKE '1' AND TRIM(debiteur_bs.debnr) NOT LIKE '2' AND TRIM(debiteur_bs.debnr) NOT LIKE '20' AND TRIM(debiteur_bs.debnr) NOT LIKE '30' AND TRIM(debiteur_bsu.debnr) NOT LIKE '1' AND TRIM(debiteur_bsu.debnr) NOT LIKE '2' AND TRIM(debiteur_bsu.debnr) NOT LIKE '20' AND TRIM(debiteur_bsu.debnr) NOT LIKE '30' AND LOWER(debiteur_ts.debnaam) NOT LIKE '%vervallen%' AND LOWER(debiteur_bs.debnaam) NOT LIKE '%vervallen%' AND LOWER(debiteur_bsu.debnaam) NOT LIKE '%vervallen%' ) ORDER BY debiteur_ts.debnr,debiteur_bs.debnr,debiteur_bsu.debnr
Deze syntax is vreemd:

FROM debiteur_ts
INNER JOIN debiteur_bs INNER JOIN debiteur_bsu WHERE

Daar verwacht ik eerder iets als:

FROM debiteur_ts
INNER JOIN debiteur_bs ON hier je voorwaarde
INNER JOIN debiteur_bsu ON hier je andere voorwaarde
ok.. maar wat kan die voorwaarde zijn dan? want 'ON' heb ik wel gezien op w3schools en op dev.mysql.com maar daar snapte ik de functie nou niet echt van.. :(

Reageren