SELECT list is not in GROUP BY.....dependent...GROUP BY
Code (php)
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)
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
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
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
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)
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
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
*
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
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.
weeral bedankt voor jouw reactie!
Ik krijg met volgende query idd gewenste resultaat :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
*
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
hierbij loop ik toch weer vast op dit onderwerp -.-
Code (php)
1
2
3
4
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)
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)
1
2
3
4
5
6
7
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
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...
Gewijzigd op 30/06/2017 22:34:36 door Ben van Velzen
enorm bedankt Ben!
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.
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
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.
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!