Prodej projektu Duchod.cz - SLEVA
Zobrazují se odpovědi 1 až 9 z 9

Distinct nefunguje pri inner join

  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.

  2. Co se právě děje na Webtrhu?
  3. misto distinct, pouzij group by (pred order by pridej GROUP BY mb_variant.id_product)
    Naposledy upravil Aleš Jiříček : 04.09.2018 v 13:49

  4. Mělo by stačit umazat "as id_product"

  5. 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

  6. Citace Původně odeslal Aleš Jiříček Zobrazit příspěvek
    misto distinct, pouzij group by (pred order by pridej GROUP BY mb_variant.id_product)
    Vdaka, vyzera, ze to funguje

  7. Citace Původně odeslal Creator13 Zobrazit příspěvek
    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)

  8. 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.

  9. 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.

  10. Citace Původně odeslal phoca Zobrazit příspěvek
    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.

Hostujeme u Server powered by TELE3