SELECT list is not in GROUP BY.....dependent...GROUP BY

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dennis WhoCares

Dennis WhoCares

21/06/2017 21:21:42
Quote Anchor link
Zou iemand mij zo vriendelijk willen zijn om dit.. in soort van jip en janneke taal uit te leggen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Expression #51 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'qshoppy.h.hlight_id' which is not functionally dependent on columns in GROUP BY clause;

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    p.*,COUNT(r.rev_id) as revAmount, SUM(r.rev_score) as revTotal,h.*,m.*
FROM qshop_products p
    LEFT JOIN qshop_reviews r
        ON r.rev_prod_id = p.prod_id
    LEFT JOIN qshop_highlighted h
        ON p.prod_id = h.hlight_prod_id
    LEFT JOIN qshop_media m
        ON p.prod_id = m.media_prod_id
WHERE
    p.prod_visible = 1 AND m.media_weight = 1
GROUP BY
    p.prod_id ORDER BY p.prod_id DESC LIMIT 0,9


Ik begrijp soort van dat... dat de database niet begrijpt WELKE h.highlight_id hij mij moet weergeven.. Aangezien het er meerdere kunnen zijn.
Zelfde geld als.. m.media_id

Als ik gewoon domweg
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
GROUP BY p.prod_id,h.hlight_id,m.media_id

doe, gaat de error wel weg.. maar.. vind het beetje jammer dat ik het niet helemaal snap, ik kan er ff niet bij, is dat raar/dom ? :D

Waarom nog grouperen op een autoincrement primary key ? :S
(waarschijnlijk wel..)

Voorbeeld waar ik bijvoorbeeld het padje zoek ben:
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
SELECT
    *
FROM
    (
        SELECT
            prod_category as subCategory, prod_headcategory as mainCategory, MAX(prod_visible) AS isVisible
        FROM
            qshop_products
        GROUP BY
            prod_category,prod_headcategory
        ORDER BY
            prod_headcatweight,prod_category
    ) p
WHERE
    p.isVisible = 1

Hier loopt ie te klagen over prod_headcatweight, maar headcatweight is niet uniek!

Toevoeging op 21/06/2017 22:00:22:

Ook al zet ik die erbij in de GROUP BY (maakt niet uit als eerste of laatste, of ertussen)
er wordt niet meer goed gegroepeerd en gesorteerd.
headcatweight, kan meerdere malen voorkomen, omdat headcategory meerdere malen kan voorkomen.
Maar category kan niet meerdere malen voorkomen in dezelfde headcategory.. tenminste, in het resultaat.
Gewijzigd op 21/06/2017 21:36:51 door Dennis WhoCares
 
PHP hulp

PHP hulp

23/12/2024 18:50:39
 
Ivo P

Ivo P

22/06/2017 08:54:12
Quote Anchor link
in GROUP BY moeten *alle* geselecteerde kolommen genoemd worden die geen aggregatie functie zijn.

Dus alles wat niet MAX(), COUNT() SUM() etc is.

SELECT * in combinatie met SUM() is een recept voor problemen.
Noem alle kolommen ipv * en dan zie je ook direct welke kolommen in group by moeten staan.

Standaard geeft mysql geen foutmelding op een verkeerd gebruik van group-by, maar dat wil niet zeggen dat je dan zinnige of verwachtbare resultaten krijgt.
 
Dennis WhoCares

Dennis WhoCares

22/06/2017 09:48:14
Quote Anchor link
Hi Ivo,

weeral bedankt voor jouw reactie!

Ik krijg met volgende query idd gewenste resultaat :
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
SELECT
    *
FROM
    (
        SELECT
            prod_category as subCategory, prod_headcategory as mainCategory, MAX(prod_visible) AS isVisible
        FROM
            qshop_products
        GROUP BY
            prod_category,prod_headcategory
        ORDER BY prod_headcatweight,subCategory
    ) p
WHERE
    p.isVisible = 1

ik MOET prod_headcatweight in GROUP BY zetten, zelfs als er geen ORDER BY ermee doe, behalve als ik m niet in SELECT hebt, maar dan kan ik ook geen ORDER BY erop doen :D


Dus moet je over de algehele query goed nadenken hoe je het moet grouperen, omdat je anders wellicht ongewenste resultaten krijg omdat er bijv. een productnaam gegroepeerd wordt wat je dus niet wil.
Zo begrijp ik ook waarom je verteld om ALLE fields te benoemen...

Vind het zo wel een heel stuk lastiger worden hoor. De queries worden gigantisch lang op zo'n manier

Dat betekend dus ook dat ik moet gaan groeperen op prod_price,prod_description,prod_stock,prod_supplierid enz enz
maar dan wel als eerste op prod_id, zodat de rest in principe nie gegroepeerd wordt?
(in een .. overzicht pagina bijvoorbeeld, of winkelmandje)
Gewijzigd op 22/06/2017 09:50:36 door Dennis WhoCares
 
Dennis WhoCares

Dennis WhoCares

30/06/2017 22:21:29
Quote Anchor link
Dag allen,

hierbij loop ik toch weer vast op dit onderwerp -.-

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT h.hlight_id,p.prod_name,m.media_path
FROM qshop_highlighted h
INNER JOIN qshop_products p ON p.prod_id = h.hlight_prod_id
INNER JOIN qshop_media m ON m.media_id = ( SELECT mm.media_id FROM qshop_media mm WHERE mm.media_prod_id = h.hlight_prod_id LIMIT 1)

Werkt perfect, maar nu wil ik nog de review scores erbij halen per product...
(p.s. ik krijg 15 unieke records)

Zonder group by volgde er een paar foutmeldingen, en kwam ik uit op onderstaande, met 0 records!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT h.hlight_id,p.prod_name,m.media_path,COUNT(r.rev_id) as revAmount, SUM(r.rev_score) as revScore
FROM qshop_highlighted h
INNER JOIN qshop_products p ON p.prod_id = h.hlight_prod_id
INNER JOIN qshop_media m ON m.media_id =
( SELECT mm.media_id FROM qshop_media mm WHERE mm.media_prod_id = h.hlight_prod_id LIMIT 1 )
INNER JOIN qshop_reviews r ON r.rev_prod_id = h.hlight_prod_id
GROUP BY h.hlight_id,m.media_path


Wat ik ook probeer met group by, ik blijf 0 records terug krijgen.
Wellicht omdat toevallig de producten die in highlighted staan nog geen review hebben? maar dan zou het gewoon 0,0 moeten zijn...
Ook JOIN, INNER, LEFT, RIGHT, UP,DOWN whatever ik snap er helemaal niks meer van en ik dacht het te snappen...
 
Ben van Velzen

Ben van Velzen

30/06/2017 22:31:35
Quote Anchor link
Als die producten geen review hoeven te hebben zul je de reviews met een LEFT JOIN moeten aanknopen, anders krijg je inderdaad geen resultaten. Waarom heb je die subquery trouwens? Dat zou ook gewoon een join kunnen/moeten zijn.
Gewijzigd op 30/06/2017 22:34:36 door Ben van Velzen
 
Dennis WhoCares

Dennis WhoCares

30/06/2017 22:38:30
Quote Anchor link
Ik moet me wat meer inlezen over JOIN, LEFT JOIN, INNER JOIN
enorm bedankt Ben!
 
Ben van Velzen

Ben van Velzen

30/06/2017 23:12:18
Quote Anchor link
LEFT JOIN is voor 0 of meer resultaten, INNER JOIN voor 1 of meer. Wanneer je dus geen resultaat in de te koppelen tabel vereist moet je een LEFT JOIN toepassen.
 
Dennis WhoCares

Dennis WhoCares

02/07/2017 17:26:48
Quote Anchor link
Bedankt voor de reactie Ben :) heb ondertussen ook een afbeelding gevonden welk een beetje visueelnuitleg geeft van de JOIN types
Maar hoe zorg ik er nou t beste voor, bij een query met 3 JOINS dat de laatste JOIN maximaal 1 resultaat mag bevatten?
Dus net als in t laatste voorbeeld voor media
 
Ben van Velzen

Ben van Velzen

02/07/2017 18:02:49
Quote Anchor link
Wanneer je die eis hebt heb je iets niet goed gedaan met je data, omdat je dan feitelijk een willekeurig resultaat krijgt. Afhankelijk van welke indexes gebruikt worden kunnen sorteervolgordes veranderen etc. Ik zou hier dus eerst naar kijken voordat je daar verder mee werkt.
 
Dennis WhoCares

Dennis WhoCares

02/07/2017 22:12:15
Quote Anchor link
Hi Ben, bedankt
ik heb het nog eens nagekeken, ik was zo druk bezig dat ik zelfs een media_id koppelde met product_id, terwijl die met media_product_id gekoppeld moest worden.

In ieder geval, een WHERE deed al genoeg :)

Laten we dit onderwerp afsluiten (: enorm bedankt voor alle hulp hints en tips!
 



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.