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]
de reden dat wij drie verschillende tabellen gebruiken is omdat wij de gegevens exporteren uit Exact. Hierbij kunnen wij geen foreign key meegeven.. :)
<?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
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
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.. :(