GROUP BY in een inner join gebruiken
Ik heb de volgende query:
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
$sql = "
SELECT
r.ID,
r.retour_nr,
c.name,
c.contact,
c.email
FROM
retouren AS r
INNER JOIN
clients AS c
ON c.ID = r.contact
GROUP BY
r.retour_nr
";
SELECT
r.ID,
r.retour_nr,
c.name,
c.contact,
c.email
FROM
retouren AS r
INNER JOIN
clients AS c
ON c.ID = r.contact
GROUP BY
r.retour_nr
";
Maar dan krijg ik:
Regel: 47
Bestand: /****/returns/returns.php
Foutmelding: SQLSTATE[42000]: Syntax error or access violation: 1055 'fleischer_grund.r.ID' isn't in GROUP BY
Hoe kan ik mijn output laten groupen op r.retour_nr?
Alvast bedankt!
Gewijzigd op 30/09/2015 00:09:42 door - Ariën -
Het gebruiken van een GROUP BY is daarom onzin. Heb je enig idee wat GROUP BY doet in SQL?
ORDER BY is om te sorteren (op volgorde van retour_nr te zetten).
GROUP BY is voor groeperen (groepjes van rijen met dezelfde retour_nr als 1 rij laten zien in het resultaat)
Maar bij GROUP BY moet je wel alle velden noemen die geen MIN(), MAX(), COUNT() of SUM() hebben.
Wat wil je precies als resultaat hebben?
Gewijzigd op 30/09/2015 07:49:44 door Jan de Laet
Aan een retour nummer kunnen meerdere producten aan vast zitten.
Dus een retour nummer kan wel 8 keer voorkomen in een tabel.
Daarom wil ik alle retour nummers groeperen
Voorbeeld:
Retournummer Bedrijfsnaam Contact E-mailadres
2102009044.30-09-15-11-4 Dalton Joni Fleischer [email protected] (Product 1)
2102009044.16-09-15-17-1 Dalton Joni Fleischer [email protected] (Product 1)
2102009044.16-09-15-17-1 Dalton Joni Fleischer [email protected] (Product 2)
2102009044.15-09-15-18-58 Dalton Joni Fleischer [email protected] (Product 1)
2102009044.15-09-15-18-58 Dalton Joni Fleischer [email protected] (Product 3)
2102009044.15-09-15-18-58 Dalton Joni Fleischer [email protected] (Product 3)
Ik zou niet weten hoe ik dan een aggregate functie moet toepassen in mijn SQL zodat de GROUP BY werkt.
Ik wil dus dat:
2102009044.30-09-15-11-4 Dalton Joni Fleischer [email protected] (Product 1)
2102009044.16-09-15-17-1 Dalton Joni Fleischer [email protected] (Product 1)
2102009044.16-09-15-17-1 Dalton Joni Fleischer [email protected] (Product 2)
2102009044.15-09-15-18-58 Dalton Joni Fleischer [email protected] (Product 1)
2102009044.15-09-15-18-58 Dalton Joni Fleischer [email protected] (Product 2)
2102009044.15-09-15-18-58 Dalton Joni Fleischer [email protected] (Product 3)
Dit wordt:
2102009044.30-09-15-11-4 Dalton Joni Fleischer [email protected] (Product 1)
2102009044.16-09-15-17-1 Dalton Joni Fleischer [email protected] (Product 1+2)
2102009044.15-09-15-18-58 Dalton Joni Fleischer [email protected] (Product 1+2+3)
Quote:
Aan een retour nummer kunnen meerdere producten aan vast zitten.
Hebben individuele records van "retouren" mogelijk verschillende contactinformatie?
Anders zou je deze (edit: de contact informatie dus) aan retour_nr op kunnen hangen en in een aparte tabel zetten.
Deze tabel noem je dan bijvoorbeeld "retouren", en de huidige tabel "retouren" zou je dan "retour_items" kunnen noemen ofzo (edit: die vervolgens aan het retournummer gekoppeld zijn).
Je query wordt dan een stukje makkelijker, je kunt dan gewoon de (nieuwe) "retouren" tabel uitlezen.
Je database zou zo opgezet moeten worden dat de vraagstukken die je deze wilt stellen makkelijk beantwoord kunnen worden. Het feit dat dit in jouw geval niet makkelijk gaat geeft aan dat de structuur dat stadium nog niet heeft bereikt.
Gewijzigd op 30/09/2015 12:56:21 door Thomas van den Heuvel
Elke retour kan 1 of meerdere producten bevatten
Clienten:
_____________________________________________________________________________________
ID | BEDRIJFSNAAM | CONTACT | EMAIL
_____________________________________________________________________________________
33860 | DALTON | Joni Fleischer | [email protected]
24041 | JUMBO | Hallo Jumbo | [email protected]
-------------------------------------------------------------------------------------
Retouren:
______________________________________________
ID | RETOURNUMMER | CONTACT_ID
______________________________________________
1 | 2102009044.30-09-15-11-4 | 33860
2 | 2102009044.30-09-15-11-4 | 33860
3 | 2102009044.30-09-15-11-4 | 33860
4 | 2102009044.15-09-15-18-58 | 24041
----------------------------------------------
SQL die nu gebruikt wordt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
$sql = "
SELECT
r.ID,
r.retour_nr,
c.name,
c.contact,
c.email
FROM
retouren AS r
INNER JOIN
clients AS c
ON c.ID = r.contact
";
SELECT
r.ID,
r.retour_nr,
c.name,
c.contact,
c.email
FROM
retouren AS r
INNER JOIN
clients AS c
ON c.ID = r.contact
";
Gewijzigd op 30/09/2015 13:06:09 door Joni Fleischer
SELECT retournr, GROUP_CONCAT(product)
FROM tabel
GROUP BY retournr
Maar in je tabel Retouren staat weer geen product genoemd... ?
Je datamodel is wat lastig (of je geeft in dit topic te weinig info.
De lijst van je post van 11:30 zou met order by gedaan moeten worden. Maar bij nader inzien was dat dus niet je vraag.
Waar staan de producten nu?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$sql = "
SELECT
r.retour_nr,
c.name,
c.contact,
c.email
FROM
retouren AS r
INNER JOIN
clients AS c
ON c.ID = r.contact
GROUP BY
r.retour_nr,
c.name,
c.contact,
c.email
";
SELECT
r.retour_nr,
c.name,
c.contact,
c.email
FROM
retouren AS r
INNER JOIN
clients AS c
ON c.ID = r.contact
GROUP BY
r.retour_nr,
c.name,
c.contact,
c.email
";
Dus id weg en in GROUP BY alle velden.
Dit kan ook
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
$sql = "
SELECT DISTINCT
r.retour_nr,
c.name,
c.contact,
c.email
FROM
retouren AS r
INNER JOIN
clients AS c
ON c.ID = r.contact
";
SELECT DISTINCT
r.retour_nr,
c.name,
c.contact,
c.email
FROM
retouren AS r
INNER JOIN
clients AS c
ON c.ID = r.contact
";
Hier ook id weg en alleen unieke waardes terug (DISTINCT)
Gewijzigd op 30/09/2015 13:30:03 door Jan de Laet
Dat zeg ik dus - je database mist een entiteit die ervoor zorgt dat je retouritems gegroepeerd kunnen worden onder één retournummer. Lees mijn vorige reactie nogmaals.
CLIENTS
Code (php)
1
2
3
4
5
6
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `clients` (
`ID` int(20) NOT NULL,
`name` varchar(255) NOT NULL,
`contact` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL
)
`ID` int(20) NOT NULL,
`name` varchar(255) NOT NULL,
`contact` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL
)
ID: uniek ID nummer klant
name: Bedrijfsnaam klant
contact: Naam contact persoon
RETOUREN
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `retouren` (
`ID` int(20) NOT NULL,
`retour_nr` varchar(255) NOT NULL,
`contact` int(10) NOT NULL,
`item` varchar(15) NOT NULL,
`amount` int(10) NOT NULL
)
`ID` int(20) NOT NULL,
`retour_nr` varchar(255) NOT NULL,
`contact` int(10) NOT NULL,
`item` varchar(15) NOT NULL,
`amount` int(10) NOT NULL
)
ID: uniek ID voor selecteren op row niveau (niet belangrijk)
RETOUR_NR: is dus de "reference" van een retour opdracht
CONTACT: Uniek ID nummer van de klant
ITEM: is het artikelnummer van een product
AMOUNT: is het aantal van het desbetreffende product.
Nu al iets duidelijker?
Sorry als dat eerst niet zo was.
Daarnaast heb je wel een tabel Retouren nodig.
Deze tabel bevat
ID
Retour_nr (uniek)
contact
de tabel retouritems
bevat
ID (id van de row)
retour_id (verwijst naar ID in de tabel Retouren)
item
amount
Toevoeging op 30/09/2015 13:39:41:
daarmee heb je direct toegang tot de unieke retournrs, die gewoon allemaal uniek in de tabel retouritems staan.
daarnaast sla je niet de contacten dubbel op in de lijst met items die retour kwamen.
Je moet de tabel retouren uitsplitsen in twee tabellen: een voor de retouren plus een voor de producten per retour.
Je bent een held!!!
Dat bedoelde ik dus! :)
@IVO
Je hebt gelijk, is zeker wel beter. Maar dan heb ik weer een extra tabel die ik moet joinen....
Een client kan trouwens meerdere contact personen hebben per bedrijf.
Dus dan zou ik dat ook weer moeten opsplitsen. Ik krijg een excel met klantgegevens aangeleverd in excel die ik importeer.....
Toch nog laatste vraag:
Hoe kan ik nou de DATA opvragen van ID?
Dat is namelijk het unieke nr per row. (voor informatie per product...)
Die kan ik dus niet zomaar in de SELECT qry zetten?
Gewijzigd op 30/09/2015 13:49:07 door Joni Fleischer
zijn natuurlijk maar beperkt tov. de enorme kosten die je maakt door de veel te grote resultsets waarin je met distinct of group by vervolgens weer moet gaan snijden om geen dubbelen binnen te krijgen.
"dan heb ik weer een extra tabel die ik moet joinen" is dan mi. ook geen argument.
Er zijn zat situaties waar je mogelijk wel 10 tabellen joint om een resultaat op te halen. So be it.
Met een tekening van je database ernaast moet dat ook geen probleem zijn.
Maar ik ga denk ik toch maar de tabellen splitten...
Dan kan ik bij het importeren daar gewoon rekening mee houden!
BEdankt allemaal!
Super!
Toevoeging op 30/09/2015 14:08:02:
![Afbeelding Afbeelding](https://farm1.staticflickr.com/636/21845308371_151701d16a_b.jpg)
View Screen Capture
Gewijzigd op 30/09/2015 14:10:51 door Joni Fleischer