Autor | Zpráva | ||
---|---|---|---|
MilanKarkulka Profil |
Každá zakázka má číslo. Pro rok 2015 měly zakázky formát 15001, 15002, 15003. Pro rok 2016 zakázky měly čísla 16001, 16002, 16003. Tento rok mají zakázky čísla 17001, 17002, 17003... .
Při zakládání nové zakázky jim navrhuji další volné číslo v pořadí = vezmu nejvyšší číslo zakázky a přičtu k němu jedničku. $result=mysql_query("select * FROM firemni_zakazky WHERE cislozakazky=(SELECT MAX(cislozakazky) FROM firemni_zakazky)"); while ($row=mysql_fetch_array($result)) { $DalsiVolneCisloZakazkyJe = $row['cislozakazky']+1; } Oni by si nyní ale chtěli vyhradit 100 nejvyšších čísel v roce na speciální zakázky. Tj. pro tento rok 17900 až 17999 by byla čísla vyhrazená pro speciální zakázky. Problém: Pokud si založí speciální zakázku řekněme 17901, tak můj skript jim příště při zakládání nové zakázky bude navrhovat 17902. To ale oni nechtějí. Chtějí, aby posledních 100 zakázek v každém roce bylo ignorováno. Jak tedy vybrat nejvyšší číslo zakázky ale ignorovat 100 posledních čísel? (mysqli není použito z historických důvodů) |
||
Kajman Profil |
Bude to pomalé, ale mohlo by jít něco jako
SELECT MAX(cislozakazky) FROM firemni_zakazky WHERE Mod(cislozakazky,1000)<900 Když víte rok zakázky, tak by bylo rychlejší něco jako SELECT MAX(cislozakazky) FROM firemni_zakazky WHERE cislozakazky BETWEEN 17000 and 17900 Osobně bych si udělal čítač v nějaké pomocné tabulce, kde bude v řádku číslo pro každý rok. Normální a speciální zakázky mohou mít také zvláštní řádky. Tabulka může být i pro jiné věci než zakázky, kde je vyžadováno více čítačů pro jednu tabulku (např. s rozlišením toho roku). |
||
MilanKarkulka Profil |
#3 · Zasláno: 19. 4. 2017, 09:19:28
Kajman:
„ SELECT MAX(cislozakazky) FROM firemni_zakazky WHERE cislozakazky BETWEEN 17000 and 17900 “
Ano, vím jaký je aktuální rok. Takže toto bude nejjednodušší řešení. Děkuji. |
||
Tomášeek Profil |
#4 · Zasláno: 19. 4. 2017, 09:29:19
Kajman:
Nemohlo by být rychlejší, pokud znám rok, než tvůj druhý dotaz jednoduše něco takového? Nejsem databázista a nevím, jak rychle vytvořit strukturu tabulky s daty, abych to poměřil, tuším, že budeš tušit od pohledu, co by můj dotaz zpomalovalo oproti tvému :-) SELECT cislozakazky FROM firemni_zakazky WHERE cislozakazky < 17900 ORDER BY cislozakazky DESC LIMIT 1 |
||
MilanKarkulka Profil |
Kajman:
„ BETWEEN 17000 and 17900 “
Ještě menší dotaz. Nepodařilo se mi vygooglit jestli tento operátor zahrnuje i čísla 1700 a 17900? MySQL BETWEEN example would return all rows from the contacts table where the contact_id is between 100 and 200 (inclusive). Vygoogleno! |
||
juriad Profil |
#6 · Zasláno: 19. 4. 2017, 09:46:53
Tomášeek:
Tvůj dotaz se od Kajmanova druhého liší jediným detailem. Tvůj vrátí záznam z řady 16900, pokud v 17000 ještě žádný neexistuje, Kajmanův raději vrátí NULL. Pozn: 16900 je také vyhrazený, takže Kajmanůj BETWEEN má být 17000 AND 17899. Je docela troufalé předpokládat, že firma nebude mít víc než 900 zakázek za rok. :-) |
||
MilanKarkulka Profil |
#7 · Zasláno: 19. 4. 2017, 09:57:01
juriad:
Systém běží už nějakých 12 let zatím nikdy nešli přes 100 zakázek za rok. Takže limit 900 je dostatečný. :) (jedná se o menší firmu, která ale vyrábí obří průmyslové stroje, typu linky na těstoviny od míchání přísad až po balení do plastu a krabic, nebo lyžařských vleků, takže jedna zakázka firmu uživí i několik měsíců...) |
||
Tomášeek Profil |
#8 · Zasláno: 19. 4. 2017, 10:26:11
juriad:
„Tvůj vrátí záznam z řady 16900, pokud v 17000 ještě žádný neexistuje, Kajmanův raději vrátí NULL.“ Jasně, máš samozřejmě pravdu. Pracoval jsem jen s číselnou řadou 17xxx a tuhle základní věc si neuvědomil.
|
||
Časová prodleva: 8 let
|
0