Új hozzászólás Aktív témák

  • martonx
    veterán

    Sikerült feltöltenem, bár nem túl sok adattal: db-fiddle
    (Fel akartam tölteni ~300e rekorddal, de nem hagyta, így nem akartam az időt húzni, hogy megtaláljam, hol a határ.)

    Eredetileg ezt a lekérdezést írtam bele (Group By-jal és Distinct nélkül):
    SELECT * 
    FROM items AS i 
    JOIN items_categories AS ic 
        ON i.item_id = ic.item_id 
    JOIN categories AS c 
        ON c.category_id = ic.category_id 
    WHERE 
    c.category_id NOT IN (1,3,13,7,20) 
    AND 
    i.item_id NOT IN (117,132,145,209,211) 
    GROUP BY i.item_id
    ORDER BY i.item_date DESC LIMIT 4

    Viszont erre ezt a hibát dobta:
    Query Error: Error: ER_WRONG_FIELD_WITH_GROUP: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.ic.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    Észrevételeim:
    1. Select *-ot el kellene felejteni, és ki kellene írni azokat mezőket amiket ki szeretnél listázni.
    2. Group By-nál szépen leírja, hogy mi a baja: bele kell venni a többi listázandó mezőt is (érdemes utána járnod, hogy mi is az a group by, mysql, mariadb specialitás, hogy a példádban szereplő szintaktikailag helytelen group by egyáltalán futni tud bizonyos helyezetekben).
    3. Önszopatás a táblák mezőit a táblanévvel kezdődően elnevezni. Ha van egy táblád, aminek categories a neve, akkor annak id, és name mezői legyenek, ne pedig category_id, category_name.
    4. Nekem ez 4 ms alatt lefut, bár nyilván több szemszögből sem lehet összehasonlítani a te adataiddal (eltérő adat mennyiség, és MySql vs MariaDB, localhostos erős géped, vs. valami ingyenes osztott hosting a dbfiddle alatt).
    SELECT DISTINCT *
    FROM items AS i
    JOIN items_categories AS ic
    ON i.item_id = ic.item_id
    JOIN categories AS c
    ON c.category_id = ic.category_id
    AND c.category_id NOT IN (1,3,13,7,20)
    WHERE i.item_id NOT IN (117,132,145,209,211)
    ORDER BY i.item_date DESC

    5. Az Item nevű tábláktól idegrángást kapok. Légyszi nevezzük már el normálisan a táblákat. Jó, hogy nem fiszfasz, meg izé nevű tábláid vannak fiszfasz_izé nevű kapcsolótáblákkal. Aztán amikor 2 év múlva ránézel, te se fogod érteni, hogy mit is akartál az egyes táblákkal leképezni.

Új hozzászólás Aktív témák