Keresés

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

  • Taci

    addikt

    válasz Taci #5106 üzenetére

    Meg lehet azt valahogy csinálni, hogy ne a subquery-ben lévő Select-re (select item_id) alkalmazott fő Select-re (select item_id, item_date) alkalmazza az Order By-t, hanem csak a fő Select-re?

    Ahogy írtam is a bejegyzésben, amire itt válaszolok most, külön-külön gyorsak a lekérdezés részei:

    select item_id 
    from items_categories 
    where 
    category_id not in  (1,3,13,7,20) and 
    item_id not in (117,132,145,209,211)
    Showing rows 0 - 24 (768981 total, Query took 0.0232 seconds.)

    SELECT item_id, item_date
    FROM items 
    ORDER BY item_date DESC LIMIT 4
    Showing rows 0 - 3 (4 total, Query took 0.0057 seconds.)

    És ha egyben van, akkor pedig az egészre nézve az Order By lassítja le:

    Order By benne:
    SELECT item_id, item_date
    FROM items
    WHERE 
    item_id IN (select item_id from items_categories where 
    category_id not in  (1,3,13,7,20) and 
    item_id not in (117,132,145,209,211))
    ORDER BY item_date DESC LIMIT 4

    Showing rows 0 - 3 (4 total, Query took 0.5749 seconds.)

    Order By nékül:
    SELECT item_id, item_date
    FROM items
    WHERE 
    item_id IN (select item_id from items_categories where 
    category_id not in  (1,3,13,7,20) and 
    item_id not in (117,132,145,209,211))
    LIMIT 4

    Showing rows 0 - 3 (4 total, Query took 0.0295 seconds.)

    Ezért gondoltam arra, ha a Group By-t "le lehetne tudni hamarabb", akkor már kellően gyors lehetne az egész lekérdezés. Mert így a join-olt (ez így subquery-vel amúgy Join-nak számít?) táblán sokat időzik az Order By miatt - amire amúgy már az elején, az első Select-nél is meg lehetne csinálni, mert úgyis csak abban van a mező, ami alapján rendez, így kár a kibővített találati táblán rendezgetni.

    Így lehetne optimális:
    SELECT item_id, item_date
    FROM items
    ORDER BY item_date DESC -- <----
    WHERE 
    item_id IN (select item_id from items_categories where 
    category_id not in  (1,3,13,7,20) and 
    item_id not in (117,132,145,209,211))
    LIMIT 4

    Persze ez itt a szintaktika nem helyes. Ahogy nézegettem, kb. ilyesmi módon lehetne helyesen lekérdezni:

    SELECT item_id, item_date
    FROM 
    (SELECT item_id, item_date
    FROM items
    ORDER BY item_date DESC) AS i
    WHERE 
    item_id IN (select item_id from items_categories where 
    category_id not in  (1,3,13,7,20) and 
    item_id not in (117,132,145,209,211)) LIMIT 4

    És ez már elég gyors is:
    Showing rows 0 - 3 (4 total, Query took 0.0156 seconds.)

    Viszont itt van egy furcsaság:
    Nálam a saját gépemen futtatva más eredményt ad a 2 változat. Az első (ahol a Group By a végén van) adja a helyes eredményeket, ez a legutóbbi pedig teljesen más rekordokat mutat, és nincsenek item_date alapján rendezve sem.

    VISZONT

    DB Fiddle-ben ugyanazok az eredmények, tehát ott meg elvileg jó az új lekérdezés:
    - Eredeti: [link] (item_id: 213, 212, 210,208)
    - Új: [link] (item_id: 213, 212, 210,208)

    Erre az új fajta lekérdezésre, és a különböző eredményekre tudtok mondani valamit?
    Esetleg finomítani ezen a változaton? (Ha pl. nem raktam bele az "AS i"'-t, akkor szólt, hogy "Every derived table must have its own alias". Így viszont a Where után lehet, hogy i.item_id kellene? Bár nem változtat az eredményen. Csak hátha ti láttok még benne valamit, azért írtam ezt a példát, hogy ez nekem csak Google-keresés eredménye. Hátha lehet csiszolni.)

  • sztanozs

    veterán

    válasz Taci #5106 üzenetére

    próbáld meg így:
    SELECT item_id, max(item_date)
    FROM items
    WHERE item_id IN
    (select item_id from items_categories
    where
    category_id not in (1,3,13,7,20) and
    item_id not in (117,132,145,209,211))
    GROUP BY item_id
    ORDER BY 2 DESC LIMIT 4

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