IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jenkings
Tvůrce
Avatar
Jenkings:30.5.2021 11:06

Zdravím
Potřeboval bych od nějakého SQL guru poradit SQL dotaz.

Mám v mariadb tabulku obsahující : ID | unikatni_klic (varchar) | datum (datetime) | pocet (int)

Od uživatele dostanu hodnotu do sloupce "unikatni_klic" a potřebuji vymyslet jak sestavit dotaz tak, aby:

A - v případě že v tabulce neexistuje záznam, který by měl stejný unikátní klíč a zároveň dnešní datum, tak ho tam vložím a do sloupce počet dám 0

B - v případě, že existuje záznam se zadaným klíčem, a datum tohoto záznamu je shodné s dnešním, pak jen updatuji tento záznam a inkrementuji počet o 1

Doteď jsem to řešil v PHP nejdřív dotazem který udělal select na záznam který má klíč stejný se zadaným a zároveň dnešní datum. Podle toho jestli pak select něco vrátil, jsem z PHP volal další dotaz který už pak byl buď INSERT nebo UPDATE

V dokumentaci jsem našel jen ukázky dotazů, které dokáží udělat INSERT nebo UPDATE jen na základě kolize unikátního klíče

Odpovědět
30.5.2021 11:06
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.5.2021 18:44

Co jsi nasel googlem?
google = maria db sql insert update in one query
... a primo v dokumentaci vidim...

https://mariadb.com/kb/en/insert-on-duplicate-key-update/

INSERT INTO ins_duplicate VALUES (4,'Gorilla') ON DUPLICATE KEY UPDATE animal='Gorilla';

SELECT * FROM ins_duplicate;
+----+----------+
| id | animal   |
+----+----------+
|  1 | Aardvark |
|  2 | Cheetah  |
|  3 | Zebra    |
|  4 | Gorilla  |
+----+----------+
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
30.5.2021 18:44
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Peter Mlich
Jenkings:31.5.2021 6:15

Ano, to je přesně ten případ, který jsem popisoval, že jsem našel.
Ten dotaz který uvádíš, ten INSERT/UPDATE umí přepínat jen podle toho jestli sloupec s unikátním klíčem je v kolizi se vkládaným záznamem, což není to, co potřebuji

Nahoru Odpovědět
31.5.2021 6:15
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:31.5.2021 8:29

Insert se da napsat mnoha zpusoby... Klidne tam muzes pridat i SELECT. Na nekterem forku nekdo zminoval, ze by to melo fungovat na jakykoliv uniq index. Jen to proste musis jinak napsat :) Hlavne by to melo byt ryhlejsi nez IF.

https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
https://dba.stackexchange.com/questions/89696/how-to-insert-or-update-using-single-query


Na jednom forku jsem nasel tohle

IF EXISTS(select * from test where id=30122)
   update test set name='john' where id=3012
ELSE
   insert into test(name) values('john');

update test set name='john' where id=3012
IF @@ROWCOUNT=0
   insert into test(name) values('john');
Editováno 31.5.2021 8:31
 
Nahoru Odpovědět
31.5.2021 8:29
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Peter Mlich
Jenkings:31.5.2021 8:35

Jak píšeš, mělo by to fungovat na všechny sloupce které mají nastavený UNIQUE, ale problém je, že ten můj "unikátní klíč" je unikátní jen v rámci jednoho dne. Tzn. že klidně každý den tam může ten klíč být jako nová záznam s novým datumem.

To řešení ale vypadá dobře, zkusím to hned jak se k tomu dostanu.

Nahoru Odpovědět
31.5.2021 8:35
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:31.5.2021 9:27

Asi ti nerozumim. Unikatni reseni na 1 den mas preci podchycene klicem, ne? Nebo, aspon, tak bych to resil ja, ze vytvorim klic nad nekolika sloupci najednou.

 
Nahoru Odpovědět
31.5.2021 9:27
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Peter Mlich
Jenkings:31.5.2021 12:02

tady jde o to, že ale může existovat více řádků se stejným datumem a různými klíči, a zároveň může existovat více řádků se stejnými klíči ale různými datumy. Což se pomocí unique řešit nedá

v podstatě se ten problém dá představit tak, že počítám, kolikrát byl daný klíč daný den použit, i když to není přesně to k čemu to využívám.

Nahoru Odpovědět
31.5.2021 12:02
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Jenkings
Petr Štechmüller:31.5.2021 15:33

Ahoj, tady ti asi chybí znalosti o primárním klíči:

A primary key must contain unique values. If the primary key consists of multiple columns, the combination of values in these columns must be unique

https://www.mysqltutorial.org/…primary-key/

Takže dej ID a date jako součást primárního klíče a měl bys mít problém vyřešen.

Nahoru Odpovědět
31.5.2021 15:33
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.6.2021 8:06

Mozna to zkusim rici jinak. Index / key, muzes vytvorit pro jeden sloupec nebo pro nekolik sloupcu najednou (malokdy se to pouziva, ale je to vyhodne pro urcite sql dotazy). Takze, pokud jsi schopen najit podle neceho vzdy jen 1 radek, tak vsechny ty sloupce pouzij pro jeden klic.
Ale, samozrejme, muzes pouzit i jiny sql dotaz. Jen pocitej s tim, ze ti mozna prepise update vice nez 1 radek nebo select najde vice nez jeden radek.

 
Nahoru Odpovědět
1.6.2021 8:06
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Peter Mlich
Jenkings:8.6.2021 11:50

Díky za trpělivost, nakonec vyřešeno hned tím prvním způsobem, jen mně tak nějak ještě chyběla znalost těch věcí okolo toho.
Každopádně nastudováno a už to funguje tak jak jsem potřeboval.
Díky

Nahoru Odpovědět
8.6.2021 11:50
Největší časovou náročnost má výpočet časové náročnosti..
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.