join , full outer join ... issue
Achtergrond
ik heb een onderhouds tabel en een klanten tabel
in de onderhouds tabel is een link naar de klanten (een klant ID)
nu wil ik een lijst tonen van alle klanten waar het jaarlijks (of 2 jaarlijks) onderhoud bijna vervalt
dus wil zeggen de query roept alle items op die tussen 15-10-14 en 15-11-14 in de tabel staan voor jaarlijks onderhoud en 15-10-13 en 15-11-13 voor 2 jaarlijks onderhoud.
deze query werkt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$onderhoudj="Jaarlijks";
$onderhoudjj="2jaarlijks";
$exp1j= date('Ymd', time() - 31536000); // huidige datum -1 jaar
$dom1j= date('Ymd', time() - 34128000); // huidige datum -1 jaar + 30 dagen
$exp2j= date('Ymd', time() - 63072000); // huidige datum -2 jaar
$dom2j= date('Ymd', time() - 68256000); // huidige datum -2 jaar + 30 dagen
$sql_onderhoud= mysql_query("SELECT *,DATE_FORMAT(Datum_onderhoud, '%d.%m.%Y') AS datum
FROM onderhoud
WHERE (typeonderhoud='$onderhoudj' AND Datum_onderhoud BETWEEN '$dom1j' AND '$exp1j')
OR (typeonderhoud='$onderhoudjj' AND Datum_onderhoud BETWEEN '$dom2j' AND '$exp2j')
ORDER BY Datum_onderhoud ASC");
?>
$onderhoudj="Jaarlijks";
$onderhoudjj="2jaarlijks";
$exp1j= date('Ymd', time() - 31536000); // huidige datum -1 jaar
$dom1j= date('Ymd', time() - 34128000); // huidige datum -1 jaar + 30 dagen
$exp2j= date('Ymd', time() - 63072000); // huidige datum -2 jaar
$dom2j= date('Ymd', time() - 68256000); // huidige datum -2 jaar + 30 dagen
$sql_onderhoud= mysql_query("SELECT *,DATE_FORMAT(Datum_onderhoud, '%d.%m.%Y') AS datum
FROM onderhoud
WHERE (typeonderhoud='$onderhoudj' AND Datum_onderhoud BETWEEN '$dom1j' AND '$exp1j')
OR (typeonderhoud='$onderhoudjj' AND Datum_onderhoud BETWEEN '$dom2j' AND '$exp2j')
ORDER BY Datum_onderhoud ASC");
?>
hieruit krijg ik de Klant_ID zodat ik weet wie dit is.
nu wil ook de naam tonen + adres ,... van de klanten waar hun onderhoud bijna vervalt.
ik had gedacht met een join, maar dit geeft telkens een error, heb al verschillende tuts nagegaan maar lukt mij niet om een goed resultaat te bekomen dit is de query
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$sql_onderhoud= mysql_query("SELECT
klanten_gegevens.Naam,
klanten_gegevens.Voornaam,
klanten_gegevens.email,
klanten_gegevens.Adres,
klanten_gegevens.Huisnummer,
klanten_gegevens.Toevoeging,
klanten_gegevens.Postcode,
klanten_gegevens.Gemeente,
klanten_gegevens.Id_klant,
onderhoud.DATE_FORMAT(Datum_onderhoud, '%d.%m.%Y') AS datum,
onderhoud.Klant_ID
FROM onderhoud JOIN klanten_gegevens ON onderhoud.Klant_ID=klanten_gegevens.Id_klant
WHERE (typeonderhoud='$onderhoudj' AND Datum_onderhoud BETWEEN '$dom1j' AND '$exp1j')
OR (typeonderhoud='$onderhoudjj' AND Datum_onderhoud BETWEEN '$dom2j' AND '$exp2j')
ORDER BY Datum_onderhoud ASC");
?>
$sql_onderhoud= mysql_query("SELECT
klanten_gegevens.Naam,
klanten_gegevens.Voornaam,
klanten_gegevens.email,
klanten_gegevens.Adres,
klanten_gegevens.Huisnummer,
klanten_gegevens.Toevoeging,
klanten_gegevens.Postcode,
klanten_gegevens.Gemeente,
klanten_gegevens.Id_klant,
onderhoud.DATE_FORMAT(Datum_onderhoud, '%d.%m.%Y') AS datum,
onderhoud.Klant_ID
FROM onderhoud JOIN klanten_gegevens ON onderhoud.Klant_ID=klanten_gegevens.Id_klant
WHERE (typeonderhoud='$onderhoudj' AND Datum_onderhoud BETWEEN '$dom1j' AND '$exp1j')
OR (typeonderhoud='$onderhoudjj' AND Datum_onderhoud BETWEEN '$dom2j' AND '$exp2j')
ORDER BY Datum_onderhoud ASC");
?>
kan iemand ne tip geven
merci
Gewijzigd op 15/11/2015 12:14:33 door Chris Bosmans
En hoe luidt de error?
Toevoeging op 15/11/2015 12:36:47:
dus er zit ergens een fout in de sql
En dus vraag je de fout op die de query geeft, in jouw geval met mysql_error().
Nee, je voert geen query uit volgens die melding. Dat is heel wat anders.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
while($toon_sql_onderhoud= mysql_fetch_array($sql_onderhoud))
{
$jaarlijks_Datum= $toon_sql_onderhoud['datum'];
$Klant_ID= $toon_sql_onderhoud['Klant_ID'];
$Naam= $toon_sql_onderhoud['Naam'];
$Voornaam= $toon_sql_onderhoud['Voornaam'];
$Adres= $toon_sql_onderhoud['Adres'];
$Huisnummer= $toon_sql_onderhoud['Huisnummer'];
$Toevoeging= $toon_sql_onderhoud['Toevoeging'];
$Postcode= $toon_sql_onderhoud['Postcode'];
$Gemeente= $toon_sql_onderhoud['Gemeente'];
$gsmtelefoon= $toon_sql_onderhoud['gsmtelefoon'];
$email= $toon_sql_onderhoud['email'];
}
?>
while($toon_sql_onderhoud= mysql_fetch_array($sql_onderhoud))
{
$jaarlijks_Datum= $toon_sql_onderhoud['datum'];
$Klant_ID= $toon_sql_onderhoud['Klant_ID'];
$Naam= $toon_sql_onderhoud['Naam'];
$Voornaam= $toon_sql_onderhoud['Voornaam'];
$Adres= $toon_sql_onderhoud['Adres'];
$Huisnummer= $toon_sql_onderhoud['Huisnummer'];
$Toevoeging= $toon_sql_onderhoud['Toevoeging'];
$Postcode= $toon_sql_onderhoud['Postcode'];
$Gemeente= $toon_sql_onderhoud['Gemeente'];
$gsmtelefoon= $toon_sql_onderhoud['gsmtelefoon'];
$email= $toon_sql_onderhoud['email'];
}
?>
error zit op de lijn van de "While"
Gewijzigd op 15/11/2015 12:48:05 door chris Bosmans
Toevoeging op 15/11/2015 12:54:07:
Overigens doe je er goed aan om over te stappen op mysqli of PDO, gezien de mysql extensie gaat verdwijnen.
Gewijzigd op 15/11/2015 12:53:25 door Ben van Velzen
Afhankelijk van het file system van je OS zijn tabelnamen mogelijk case-sensitive. Voor kolomnamen lijkt het niet uit te maken. Dus het is ofwel zoiets (je ontwikkelt in WAMP/XAMP onder Windows, en je productie webserver opereert onder UNIX?), of je hebt ergens een spellingsfout in je kolommen zitten. Zoiets zal het zijn.
En ja, druk eens een foutmelding af zoals Ben aangeeft, dat is de meest directe manier om iets te debuggen.
de check voor de query
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if ($sql_onderhoud = mysql_query("SELECT
klanten_gegevens.Naam,
klanten_gegevens.Voornaam,
klanten_gegevens.email,
klanten_gegevens.Adres,
klanten_gegevens.Huisnummer,
klanten_gegevens.Toevoeging,
klanten_gegevens.Postcode,
klanten_gegevens.Gemeente,
klanten_gegevens.Id_klant,
DATE_FORMAT(onderhoud.Datum_onderhoud, '%d.%m.%Y') AS datum,
onderhoud.Klant_ID
FROM onderhoud JOIN klanten_gegevens ON onderhoud.Klant_ID=klanten_gegevens.Id_klant
WHERE (typeonderhoud='$onderhoudj' AND Datum_onderhoud BETWEEN '$dom1j' AND '$exp1j') OR (typeonderhoud='$onderhoudjj' AND Datum_onderhoud BETWEEN '$dom2j' AND '$exp2j') ORDER BY Datum_onderhoud ASC") === false) {
echo "de error is : ". mysql_error();
}
?>
if ($sql_onderhoud = mysql_query("SELECT
klanten_gegevens.Naam,
klanten_gegevens.Voornaam,
klanten_gegevens.email,
klanten_gegevens.Adres,
klanten_gegevens.Huisnummer,
klanten_gegevens.Toevoeging,
klanten_gegevens.Postcode,
klanten_gegevens.Gemeente,
klanten_gegevens.Id_klant,
DATE_FORMAT(onderhoud.Datum_onderhoud, '%d.%m.%Y') AS datum,
onderhoud.Klant_ID
FROM onderhoud JOIN klanten_gegevens ON onderhoud.Klant_ID=klanten_gegevens.Id_klant
WHERE (typeonderhoud='$onderhoudj' AND Datum_onderhoud BETWEEN '$dom1j' AND '$exp1j') OR (typeonderhoud='$onderhoudjj' AND Datum_onderhoud BETWEEN '$dom2j' AND '$exp2j') ORDER BY Datum_onderhoud ASC") === false) {
echo "de error is : ". mysql_error();
}
?>
dan geeft hij geen error boodschap
maar ook geen gegevens -
Gewijzigd op 15/11/2015 15:06:44 door chris Bosmans
Kortom, laat je hele script eens zien. Is de kolom Datum_onderhoud van het type DATE of DATETIME?
Of misschien heeft de query wel gewoon geen resultaten voor die periode, heb je dat al gecontroleerd, ik bedoel, zou dit resultaten moeten hebben?
Sowieso kloppen $dom2j en $exp2j volgens mij niet, het verschil tussen deze twee datums is ~2 maanden.
En dan dat datumformaat... Ymd? Waarom niet gewoon een DATE(TIME) in je database?
Precies het punt waar ik op wilde komen dus, maar gezien het gebruik van DATE_FORMAT ga ik er vanuit dat hij wel DATE(TIME) gebruikt, maar gewoon niet correct vergelijkt.
En dan heeft de query mogelijk helemaal geen resultaat, als een query verder syntactisch correct is - MySQL heeft verder geen idee van wat je probeert te doen dus als je lege domeinen zit te observeren zal MySQL gewoon teruggeven "geen resultaten gevonden, have a nice day".
en die werkte perfect (haalde de juiste velden uit mijn tabel)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$onderhoudj="Jaarlijks";
$onderhoudjj="2jaarlijks";
$exp1j= date('Ymd', time() - 31536000); //20141115
$dom1j= date('Ymd', time() - 34128000); //20141016
$exp2j= date('Ymd', time() - 63072000); //20131115
$dom2j= date('Ymd', time() - 68256000); //20130916
$sql_onderhoud= mysql_query("SELECT *,DATE_FORMAT(Datum_onderhoud, '%d.%m.%Y') AS datum FROM onderhoud WHERE (typeonderhoud='$onderhoudj' AND Datum_onderhoud BETWEEN '$dom1j' AND '$exp1j') OR (typeonderhoud='$onderhoudjj' AND Datum_onderhoud BETWEEN '$dom2j' AND '$exp2j') ORDER BY Datum_onderhoud ASC");
?>
$onderhoudj="Jaarlijks";
$onderhoudjj="2jaarlijks";
$exp1j= date('Ymd', time() - 31536000); //20141115
$dom1j= date('Ymd', time() - 34128000); //20141016
$exp2j= date('Ymd', time() - 63072000); //20131115
$dom2j= date('Ymd', time() - 68256000); //20130916
$sql_onderhoud= mysql_query("SELECT *,DATE_FORMAT(Datum_onderhoud, '%d.%m.%Y') AS datum FROM onderhoud WHERE (typeonderhoud='$onderhoudj' AND Datum_onderhoud BETWEEN '$dom1j' AND '$exp1j') OR (typeonderhoud='$onderhoudjj' AND Datum_onderhoud BETWEEN '$dom2j' AND '$exp2j') ORDER BY Datum_onderhoud ASC");
?>
ik heb de de echo van de dom en exp er bij gezet
met deze functie krijg ik 4 resultaten
die gegevnes kan ik met een while functie tonen geen probleem hier.
alleen heb ik in deze tabel "onderhoud" alleen een link naar klant gegevens heb nl klant_ID.
de klant gegevens zitten in de tabel "klanten_gegevens" (adres, naam)
ik dacht dat ik met een join al deze gegevens tegelijk met een query kan tonen.
Verander je JOIN eens in een LEFT JOIN en controleer vervolgens of je klanten_gegevens data (allemaal) NULL waarden heeft.
Het klinkt alsof je niet werkt met foreign keys / de InnoDB engine, oftewel al je data hangt als los zand aan elkaar? Dan kunnen dit soort inconsistenties ook een stuk sneller optreden waarbij je data onderling niet meer klopt/past.
Tijd om je database eens fatsoenlijk op te zetten?