Portál AbcLinuxu, 10. listopadu 2025 02:22
update t t1 set ... where (select count(*) from t t2 where t1.clovek_id=t2.clovek_id and t1.pk>t2.pk)>=3 and clovek_id=1
Môj problém je takýto, skúsim to slovne vysvetliť. Mám clovek_id a datum. A teraz by som chcel updatovat všetky riadky v databáze, kde je clovek_id=38 a datum iné ako 0000-00-00 00:00:00, ale preskočiť by mal prvé tri záznamy toho človeka a updatovať všetko ostatné počínajúc štvrtým záznamom. snáď som to neschaosil :D
. To by mělo ty první tři záznamy přeskočit.
Pokud jen tři řádky vynechat, tak bych si přečetl ID těch řádků a použil where not in (...) nebo id <> neco and id <> neco atd. Jsou to jen tři záznamy, takže by to mohlo být jedno.
LIMIT {[offset,] row_count | row_count OFFSET offset}…LIMIT 3, 10 nebo …LIMIT 10 OFFSET 3 je deset řádku od třetího.
LIMIT v této podobě se dá použít pouze v příkazu SELECT a nikoli UPDATE. Ovšem pomocí složeného dotazu to určitě půjde.
Špatný návrh. Dlouze se zamyslet nad předěláním struktury a tenhle úkon přemýstit do aplikační části, takovéhle podivnosti mohou být původcem velkých problémů.
), tak nechápu, proč by kvůli tomu musel psát aplikační skript, navíc zatíženej takovejma věcma, jako že se data můžou pod rukama měnit atd... (v mysql málokdo používá repeatable read).

). Jen to co jsi napsal není pravda a navíc jsi to ještě napsal nepřijemně.
Navíc, řešení pro mysql jsem nahoře napsal (řešení s temporary table), kolega to doplnil s možností aplikačního řešení. Má to své problémy s izolací transakcí (bez zámků by to muselo být serializible), ale pokud ty tři vyselektované záznamy zamkne, tak to fungovat bude.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.