Query met join naar 2 velden
Ik zal het probleem zo goed mogelijk progeren te omschrijven:
Ik heb een database met brilbestellingen. Iedere brilbestelling bevat oa een klantID: AdrId en 2 glazen. GloGlaIdR en GloGlaIdL. Deze velden bevatten unieke ID's welke in de tabel glass terug komen. In de tabel Glass heb ik dus een veld GlaID. Hier staan dus alle glazen in die ooit besteld zijn. Met de benodigde glas gegevens.
Nu wil ik een query bouwen waar ik een overzicht krijg van alle klanten (distinct) die ooit een glas hebben besteld. Echter krijg ik het met joinen niet voor elkaar dat ik zowel de linker als de rechter glazen pak. Dit is mijn query tot nu toe:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT DISTINCT
Address.AdrId as Klant_ID,
Address.AdrNumber as Klant_nummer,
Address.AdrFirstName as Klant_voornaam,
Address.AdrMiddleName as Klant_tussenvoegsel,
Address.AdrLastName as Klant_achternaam,
Address.AdrAddress as Klant_straat,
Address.AdrAddressNumber as Klant_huistnummer,
Address.AdrZipCode as Klant_postcode,
Address.AdrCity as Klant_woonplaats,
Address.AdrDeceased as Klant_overleden,
Address.AdrMailable as Klant_mailen,
GlassOrder.GloId as Glasorder_Id,
GlassOrder.GloAdrId as Glasorder_Klantid,
GlassOrder.GloGlaIdR as Glasorder_rechts,
GlassOrder.GloGlaIdL as Glasorder_links,
Glass.GlaId as Glas_ID,
Glass.GlaName as Glas_naam
FROM Address
INNER JOIN GlassOrder ON Address.AdrId = GlassOrder.GloAdrId
INNER JOIN Glass ON GlassOrder.GloGlaIdR = Glass.GlaId
Address.AdrId as Klant_ID,
Address.AdrNumber as Klant_nummer,
Address.AdrFirstName as Klant_voornaam,
Address.AdrMiddleName as Klant_tussenvoegsel,
Address.AdrLastName as Klant_achternaam,
Address.AdrAddress as Klant_straat,
Address.AdrAddressNumber as Klant_huistnummer,
Address.AdrZipCode as Klant_postcode,
Address.AdrCity as Klant_woonplaats,
Address.AdrDeceased as Klant_overleden,
Address.AdrMailable as Klant_mailen,
GlassOrder.GloId as Glasorder_Id,
GlassOrder.GloAdrId as Glasorder_Klantid,
GlassOrder.GloGlaIdR as Glasorder_rechts,
GlassOrder.GloGlaIdL as Glasorder_links,
Glass.GlaId as Glas_ID,
Glass.GlaName as Glas_naam
FROM Address
INNER JOIN GlassOrder ON Address.AdrId = GlassOrder.GloAdrId
INNER JOIN Glass ON GlassOrder.GloGlaIdR = Glass.GlaId
Iemand enig idee hoe ik deze query kan aanpassen?
Wat bedoel je metlinker en rechter glazen?
Zodat de gebruiker zelf een xml kan maken, maar dan is het voor de gebruiker over het algemeen wel prettig om een logische nl naam te hebben voor in het rapport.
Een bril heeft twee glazen. Een linker en een rechter glas. (links is GloGlaIdL en rechts is GloGlaIdR) Beide glazen hebben een eigen unieke ID. Dit ID is het zelfde ID als het Glas ID in de tabel Glass. (hier staan dus alle glazen in die ooit verkocht zijn)
edit:
Ik heb nu het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT DISTINCT
Address.AdrId as Klant_ID,
Address.AdrNumber as Klant_nummer,
Address.AdrFirstName as Klant_voornaam,
Address.AdrMiddleName as Klant_tussenvoegsel,
Address.AdrLastName as Klant_achternaam,
Address.AdrAddress as Klant_straat,
Address.AdrAddressNumber as Klant_huistnummer,
Address.AdrZipCode as Klant_postcode,
Address.AdrCity as Klant_woonplaats,
Address.AdrDeceased as Klant_overleden,
Address.AdrMailable as Klant_mailen,
GlassOrder.GloId as Glasorder_Id,
GlassOrder.GloAdrId as Glasorder_Klantid,
GlassOrder.GloGlaIdR as Glasorder_rechts,
GlassOrder.GloGlaIdL as Glasorder_links,
Glass.GlaId as Glas_ID,
Glass.GlaName as Glas_naam
FROM Address
INNER JOIN GlassOrder ON Address.AdrId = GlassOrder.GloAdrId
INNER JOIN Glass ON GlassOrder.GloGlaIdR = Glass.GlaId OR Glass.GlaId = GlassOrder.GloGlaIdL
Address.AdrId as Klant_ID,
Address.AdrNumber as Klant_nummer,
Address.AdrFirstName as Klant_voornaam,
Address.AdrMiddleName as Klant_tussenvoegsel,
Address.AdrLastName as Klant_achternaam,
Address.AdrAddress as Klant_straat,
Address.AdrAddressNumber as Klant_huistnummer,
Address.AdrZipCode as Klant_postcode,
Address.AdrCity as Klant_woonplaats,
Address.AdrDeceased as Klant_overleden,
Address.AdrMailable as Klant_mailen,
GlassOrder.GloId as Glasorder_Id,
GlassOrder.GloAdrId as Glasorder_Klantid,
GlassOrder.GloGlaIdR as Glasorder_rechts,
GlassOrder.GloGlaIdL as Glasorder_links,
Glass.GlaId as Glas_ID,
Glass.GlaName as Glas_naam
FROM Address
INNER JOIN GlassOrder ON Address.AdrId = GlassOrder.GloAdrId
INNER JOIN Glass ON GlassOrder.GloGlaIdR = Glass.GlaId OR Glass.GlaId = GlassOrder.GloGlaIdL
Echter wil ik nu een distinct op Address.AdrId. Dit zodat elke klant maar 1 keer wordt weergegeven ookal heeft de klant meerder glasorders (zowel links als rechts) Ziet iemand waarom mijn distinct nu niet werkt?
Gewijzigd op 01/01/1970 01:00:00 door SanderV
Dennis Mertens schreef op 15.04.2009 12:18:
Omdat dit een hele goede gewoon is bij een alias.Waarom gebruik je bij alles een AS?
Quote:
Bril, 2 glazen, eentje links en eentje rechts. Al heeft een duikbril maar 1 glaz...Wat bedoel je metlinker en rechter glazen?
DISTINCT gaat hier niet werken, wanneer 1 klant verschillende combinaties links-rechts heeft besteld, zal de klant meerdere keren worden genoemd. Wanneer jij alle klanten wilt hebben, moet je gewoon klanten opvragen die minimaal 1 bestelling hebben.
Ik zou eerst even m'n vraag bijstellen en dan een passende query gaan zoeken. Komt bij dat dode klanten niet van die beste klanten zijn, lijkt me handiger dat je die niet selecteert...