join , full outer join ... issue

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Chris Bosmans

chris Bosmans

15/11/2015 12:12:32
Quote Anchor link
allen

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)
PHP script in nieuw venster Selecteer het PHP script
1
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"
);
?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
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"
);
?>


kan iemand ne tip geven
merci
Gewijzigd op 15/11/2015 12:14:33 door Chris Bosmans
 
PHP hulp

PHP hulp

10/11/2024 16:59:36
 
Ben van Velzen

Ben van Velzen

15/11/2015 12:31:05
Quote Anchor link
En hoe luidt de error?
 
Chris Bosmans

chris Bosmans

15/11/2015 12:36:21
Quote Anchor link
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given

Toevoeging op 15/11/2015 12:36:47:

dus er zit ergens een fout in de sql
 
Ben van Velzen

Ben van Velzen

15/11/2015 12:38:55
Quote Anchor link
En dus vraag je de fout op die de query geeft, in jouw geval met mysql_error().
 
Chris Bosmans

chris Bosmans

15/11/2015 12:43:49
Quote Anchor link
error is: Query was empty

hij vind geen gegevens ...
Gewijzigd op 15/11/2015 12:45:12 door chris Bosmans
 
Ben van Velzen

Ben van Velzen

15/11/2015 12:45:13
Quote Anchor link
Nee, je voert geen query uit volgens die melding. Dat is heel wat anders.
 
Chris Bosmans

chris Bosmans

15/11/2015 12:46:15
Quote Anchor link
dit is wat ik doe
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'];
}

?>


error zit op de lijn van de "While"
Gewijzigd op 15/11/2015 12:48:05 door chris Bosmans
 
Ben van Velzen

Ben van Velzen

15/11/2015 12:53:08
Quote Anchor link
Nee, de error zit in de query, want $sql_onderhoud bevat reen MySQL resource. Kijk dus eerst naar de foutafhandeling.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if (($sql_onderhoud = mysql_query(.....)) === false) {
  echo mysql_error();
}

?>


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
 
Thomas van den Heuvel

Thomas van den Heuvel

15/11/2015 14:23:08
Quote Anchor link
Word je zelf niet helemaal scheel van al die (semi-willekeurige?) hoofd- en kleine letters in je kolomnamen? Grote kans dat hier ergens iets fout zit.

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.
 
Chris Bosmans

chris Bosmans

15/11/2015 15:02:46
Quote Anchor link
de case is dubbelchecked en alles is correct in sql en phpvariablen
de check voor de query

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>


dan geeft hij geen error boodschap
maar ook geen gegevens -
Gewijzigd op 15/11/2015 15:06:44 door chris Bosmans
 
Ben van Velzen

Ben van Velzen

15/11/2015 15:19:39
Quote Anchor link
Kortom, laat je hele script eens zien. Is de kolom Datum_onderhoud van het type DATE of DATETIME?
 
Thomas van den Heuvel

Thomas van den Heuvel

15/11/2015 15:28:21
Quote Anchor link
Dan is er iets fout met je datums?

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?
 
Ben van Velzen

Ben van Velzen

15/11/2015 15:41:22
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

15/11/2015 15:53:27
Quote Anchor link
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".
 
Chris Bosmans

chris Bosmans

15/11/2015 15:54:42
Quote Anchor link
ik had eerst deze query
en die werkte perfect (haalde de juiste velden uit mijn tabel)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");
?>


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.
 
Thomas van den Heuvel

Thomas van den Heuvel

15/11/2015 16:00:02
Quote Anchor link
Dan levert je onderhoud-query wel resultaten op maar kloppen de klant id's niet, of bestaan deze niet in je klanten_gegevens tabel.

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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.