logo
04.09.2018 13:17
1
Potrebujem urobit select, ktory by mi vracal iba jedno id produktu


SELECT DISTINCT mb_variant.id_product as id_product, mb_variant.id_size, mb_variant.id_color, mb_product.url_sk, mb_product.title_sk, mb_variant.id, mb_variant.price, mb_variant.price_old, mb_variant.stock1 FROM mb_product INNER JOIN mb_product_category ON mb_product.id = mb_product_category.id_product INNER JOIN mb_variant ON mb_product.id = mb_variant.id_product WHERE mb_product_category.id_category IN (21) AND mb_variant.price > 0 AND mb_variant.id_color = 3 ORDER BY mb_variant.stock1 DESC

Tento zapis mi dava vyhodi viacero id_product. Ako sa tomu vyhnut? Evidentne to mam spatne.

Co se právě děje na Webtrhu?

04.09.2018 13:27
2
misto distinct, pouzij group by (pred order by pridej GROUP BY mb_variant.id_product)
04.09.2018 13:57
3
Mělo by stačit umazat "as id_product"
04.09.2018 14:17
4
nefunguje ti to nejspíš proto, že výsledek obsahuje sloupec, který ti to rozmnožuje a je unikátní, prakticky asi cokoliv z mb_variant. Předpokládám, že chceš pro každý produkt vytáhnout pouze jeden řádek s jedinou variantou, je to tak? Group by v tomhle případě nepomůže.

Tohle třeba vytáhne každý product_id pouze jedenkrát a vezme u něho variantu s nejnižším ID, která splňuje podmínky na barvu a cenu, je to co chceš? Co když produkt má více variant, které vyhovují?

Kód:
SELECT DISTINCT mb_variant.id_product as id_product, mb_variant.id_size, mb_variant.id_color, mb_product.url_sk, mb_product.title_sk, , mb_variant.price, mb_variant.price_old, mb_variant.stock1 
ROM mb_product
INNER JOIN mb_product_category ON mb_product.id = mb_product_category.id_product
INNER JOIN mb_variant ON mb_product.id = mb_variant.id_product
WHERE mb_variant.id in (SELECT id
    FROM (
        SELECT id_product, min(id) id
        FROM mb_variant
        WHERE price > 0 AND id_color = 3
        GROUP BY id_product
    )
)
AND mb_product_category.id_category IN (21)
ORDER BY mb_variant.stock1 DESC
04.09.2018 14:20
5
Původně odeslal Aleš Jiříček
misto distinct, pouzij group by (pred order by pridej GROUP BY mb_variant.id_product)
Vdaka, vyzera, ze to funguje
04.09.2018 15:05
6
Původně odeslal Creator13
Vdaka, vyzera, ze to funguje
Ale pozor na GROUP BY, pokud ti někdo v budoucnosti upgraduje databázi (mysql) na verzi, kde bude striktní pravidlo: ONLY_FULL_GROUP_BY, pak to pravidlo budeš muset vypnout, nebo budeš muset přepsat SQL dotaz (aby GROUP BY obsahovalo všechny tázané sloupce - v tomhle ohledu je lepší se GROUP BY vyhnout, pokud to jde)
17.09.2018 16:06
7
No nastal problem. Na webhostingu je striktne pravidlo only_full_group_by

Na podpore mi dali info
je mozne ten mod vypnut per connection, ked sa v kode pripajate k db
Poradi mi niekto ako na to? Zatial sa mi nepodaril najst navod na vypinanie jednotlivych modov.
Skusal som vypnut v phpmyadmine, ale prava ma nepustia ulozit zmeny v premennej sql_mode.
17.09.2018 17:24
8
Možností může být víc:

při připojení k databázi "nastavíte" sql mode, např:

Kód:
"SET sql_mode = ''"
tím ale smažete veškeré nastavení sql modu, což není dobré, proto je lepší vymazat konkrétně jen to jedno pravidlo:

Kód:
"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
Nebo si vypsat všechny "vlastní" pravidla (příklad v PHP):

Kód:
$sqlModes = [
			'STRICT_TRANS_TABLES',
			'ERROR_FOR_DIVISION_BY_ZERO',
			'NO_AUTO_CREATE_USER',
			'NO_ENGINE_SUBSTITUTION',
		];
$connection->query('SET @@SESSION.sql_mode = \'' . implode(',', $sqlModes) . '\';');
Těch možností může být více, na základě verze databáze nastavit zda fungujete ve strict modu nebo ne, atd.
18.09.2018 09:15
9
Původně odeslal phoca
Možností může být víc:

při připojení k databázi "nastavíte" sql mode, např:

Kód:
"SET sql_mode = ''"
tím ale smažete veškeré nastavení sql modu, což není dobré, proto je lepší vymazat konkrétně jen to jedno pravidlo:

Kód:
"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
Nebo si vypsat všechny "vlastní" pravidla (příklad v PHP):

Kód:
$sqlModes = [
			'STRICT_TRANS_TABLES',
			'ERROR_FOR_DIVISION_BY_ZERO',
			'NO_AUTO_CREATE_USER',
			'NO_ENGINE_SUBSTITUTION',
		];
$connection->query('SET @@SESSION.sql_mode = \'' . implode(',', $sqlModes) . '\';');
Těch možností může být více, na základě verze databáze nastavit zda fungujete ve strict modu nebo ne, atd.
Vdaka. Vsetko teraz funguje tak, ako ma.