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
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
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: