GROUP BY in een inner join gebruiken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Joni Fleischer
Moderator

Joni Fleischer

29/09/2015 22:20:49
Quote Anchor link
Hallo allemaal,

Ik heb de volgende 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
$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
";


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 -
 
PHP hulp

PHP hulp

20/04/2024 03:55:31
 
Aad B

Aad B

29/09/2015 23:18:45
Quote Anchor link
Waarom GROUP BY? Je gebruikt nergens een aggregate functie waarbij een GROUP BY nodig zou zijn.
Het gebruiken van een GROUP BY is daarom onzin. Heb je enig idee wat GROUP BY doet in SQL?
 
Jan de Laet

Jan de Laet

30/09/2015 07:44:06
Quote Anchor link
Misschien bedoel je ORDER BY ipv GROUP BY?
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
 
Joni Fleischer
Moderator

Joni Fleischer

30/09/2015 11:30:41
Quote Anchor link
Kijk:


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.
 
Ivo P

Ivo P

30/09/2015 11:44:04
Quote Anchor link
Dat is dus ORDER BY
en niet GROUP BY


http://wiki.pfz.nl/group-by
 
Joni Fleischer
Moderator

Joni Fleischer

30/09/2015 12:53:39
Quote Anchor link
Dat is dus GROUP BY.


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

Thomas van den Heuvel

30/09/2015 12:53:48
Quote Anchor link
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
 
Joni Fleischer
Moderator

Joni Fleischer

30/09/2015 13:03:40
Quote Anchor link
Elke retour heeft 1 contact.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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
";
Gewijzigd op 30/09/2015 13:06:09 door Joni Fleischer
 
Ivo P

Ivo P

30/09/2015 13:18:30
Quote Anchor link
je query zou iets kunnen zijn als

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?
 
Jan de Laet

Jan de Laet

30/09/2015 13:27:29
Quote Anchor link
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
$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
";


Dus id weg en in GROUP BY alle velden.

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


Hier ook id weg en alleen unieke waardes terug (DISTINCT)
Gewijzigd op 30/09/2015 13:30:03 door Jan de Laet
 
Thomas van den Heuvel

Thomas van den Heuvel

30/09/2015 13:27:44
Quote Anchor link
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.
 
Joni Fleischer
Moderator

Joni Fleischer

30/09/2015 13:32:12
Quote Anchor link
Hier alle *Juiste* informatie. @Ivo: Je hebt gelijk :)

CLIENTS
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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: uniek ID nummer klant
name: Bedrijfsnaam klant
contact: Naam contact persoon


RETOUREN
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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: 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.
 
Ivo P

Ivo P

30/09/2015 13:38:20
Quote Anchor link
je tabel Retouren zou de naam Retouritems moeten krijgen.

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.
 
Ward van der Put
Moderator

Ward van der Put

30/09/2015 13:39:51
Quote Anchor link
Je moet de tabel retouren uitsplitsen in twee tabellen: een voor de retouren plus een voor de producten per retour.
 
Joni Fleischer
Moderator

Joni Fleischer

30/09/2015 13:46:34
Quote Anchor link
@Jan de Laet
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
 
Ivo P

Ivo P

30/09/2015 13:51:45
Quote Anchor link
De kosten van een extra regeltje in je query (join retouritems)

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.
 
Joni Fleischer
Moderator

Joni Fleischer

30/09/2015 13:58:16
Quote Anchor link
Nou ik ben niet zo sterk met joins haha :)

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
View Screen Capture
Gewijzigd op 30/09/2015 14:10:51 door Joni Fleischer
 



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.