Autor Zpráva
jtfcobra
Profil
Výpis z databáze od čísla 4000 až do 9000 ?

Poradíte jak to udělat mysql ? mam zaznamy 1-10000
Alphard_
Profil *
Co třeba dát do where 2 porovnávací podmínky (<= a >=) spojenené operátorem AND?
lionel messi
Profil
jtfcobra:
Len pre istotu doplním, že ak by vám Alphardovo riešenie náhodou nefungovalo, skontrolujte si, či ukladáte číslo ako správny dátový typ, čiže pre celé číslo int a nie napríklad text.
jtfcobra
Profil
Int cislo
Jan Kozák
Profil
lionel messi:
Co by se muselo stát, aby to nefungovalo?
Keeehi
Profil
Jan Kozák:
Datový typ sloupce by byl třeba VARCHAR.
kokolino
Profil
len doplním Alphard môžete použiť aj variantu s BETWEEN vyzeralo by to nasledovne
select cislo from tabulka where cislo between 4000 and 9000
Jan Kozák
Profil
Keeehi:
Když tam bude datový typ text, typ varchar to už být nemůže.
Na to doplnění jsem se ptal proto, že si myslím, že v tomto případě porovnávání vyjde shodně bez ohledu na to, zda jde o řetězec, nebo číslo.
Keeehi
Profil
Text nebo varchar, pro porovnání je to jedno. Problémy budou dělat oba.

Jan Kozák:
porovnávání vyjde shodně bez ohledu na to, zda jde o řetězec, nebo číslo.
Až na to, že ne. Tohle není PHP které automaticky přetypovává. Pokud jde o dva textové datové typy, porovnává se lexikálně - znak po znaku dokud se shodují pak se porovnají ty první různé znaky.
SELECT 10 < 2; -- vrátí správně 0
SELECT '10' < '2'; -- vrátí špatně 1
Jan Kozák
Profil
Pravda, jde-li o řetězce, sedí to jen v případě, že hodnoty mají stejný počet cifer.

Pokud ale položím dotaz: SELECT cislo FROM pokus WHERE cislo<=9000 AND cislo>=4000, získám stejné výsledky bez ohledu na datový typ sloupce. Z čísla, se kterým se snažím porovnávat obsah sloupce, totiž řetězec nevytvářím.
mimochodec
Profil
Jan Kozák:
získám stejné výsledky bez ohledu na datový typ sloupce

Nezískáš, protože "8" > "4000". Nepiš sem nesmysly. Tam, kde se pracuje s čísly, nemá řetězcový datový typ co dělat.
Jan Kozák
Profil
Nesmysly? Nezískám?
Jaký obdržíš výsledek po spuštění těchto dotazů?
CREATE TABLE `pokus` (
  `cislo` varchar(5) COLLATE utf8_czech_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
INSERT INTO `pokus` (`cislo`) VALUES
('1'),
('2'),
[...]
('10000');

SELECT cislo FROM pokus WHERE cislo<=9000 AND cislo>=4000
Mně to totiž vrátí 5001 čísel z intervalu od 4000 do 9000. Přesně to, co tazatel chtěl.
juriad
Profil
Hádáte se tu zbytečně. Snažíte se porovnávat různé datové typy:
- číslo s číslem se porovnává číselně
- řetězec s řetězcem se porovnává řetězcově
- řetězec s číslem se porovnává čísleně (dojde ke konverzi)

Číslo by vždy mělo být v číselném sloupci a v SQL dotazu by mělo být zapsané jako číslo (bez apostrofů či uvozovek).
Jan Kozák
Profil
Není to zbytečné. Podstatné je, že jsme se dobrali k tomu, že exaktní práce, jakou je programování, nevrací nahodilé výsledky, ale předem dané. Jakkoliv je zřejmé, že ukládání čísla jako řetězce je nevhodné zejména z výkonnostních důvodů (ačkoliv v tomto případě nejspíš rozdíl nebude měřitelný), je chybou tvrdit, že při uložení jako řetězce bude databáze vracet chyby, nepředpokládaná data či nevím co. Pokud někdo tvrdí, že se databáze chová jinak, než tomu ve skutečnosti je, je jeho výpověď chybná a je žádoucí ji opravit, případně se otázat, která podmínka způsobuje, že řešení může „náhodou nefungovat“. A pokud někdo uvidí, že se hodí si občas něco ověřit před označováním cizích výpovědí za nesmysly, je to velmi přínosné.
mimochodec
Profil
Jan Kozák:
lionel messi v [#3] možná ne úplně štastně zmínil možnost, při které by se dotaz choval jinak, než je žádoucí, a to za situace, kdy by čísla byla uložena jako text. Toto jtfcobra v [#4] vyvrátil, čímž se diskuse o textových (nevhodných) datových typech stala bezpředmětnou. Tebe to neodradilo od tlachání o tom, že čísla lze ukládat jako text. Keeehi ti napsal jeden důkaz toho, že to není vhodné, já jsem napsal další. Netuším, co se snažíš dokázat. Nikdo netvrdí, že databáze vv těch případech vrací chyby. Tvrdím, že kdo pracuje s číselnými hodnotami takto:

$i="5";
$j= 2 * $i;

//

... WHERE k > "5"
... INSERT INTO tbl (cislo) VALUES ("100") // přičemž s tím chce nadále pracovat jako s číslem

apod, ten dělá chybu a dřív nebo později narazí na chování, které sice není nepředvídatelné, ale je nežádoucí. Pokud se na to dotyčný člověk ptá, rád ho usměrním. Pokud toto chce někdo radit, nebudu se moc snažit korigovat ho slušně. Pokud při selectu použiješ stejně čuněcí styl jako při vkládání, tedy
SELECT cislo FROM pokus WHERE cislo<="9000" AND cislo>="4000"
možná pochopíš, co se snažím naznačit, tedy že je významný rozdíl mezi textovým a číselným datovým typem. A jestli to nepochopíš ani z toho, zkus si na konec toho tvého dotazu přidat ORDER BY cislo.
Jan Kozák
Profil
Měl bys vědět, že není zakázáno ve vlákně pokračovat poté, co byl problém původního tazatele vyřešen. Není závadou, pokud se debata později přesune směrem, který už zakladatele vlákna nezajímá. Jakékoliv vyvracení chybných tvrzení je na odborných diskusích žádoucí. Pokud tomu nevěříš, můžeš se zeptat kteréhokoliv moderátora. Je nepřiměřené zpochybňování nesprávných výroků nazývat „tlacháním“. Ale chápu, že útok z tvé strany má zastírat, že jsi nevěděl, že při porovnávání s číslem nezáleží, zda je druhá porovnávaná hodnota číslo, nebo řetězec.

Datový typ ukládaných dat nemá se zápisem v PHP vůbec nic společného. Může se stát, že databázi navrhuje někdo jiný, než kdo píše skripty; programátor na drtivou většinu úkonů vůbec nepotřebuje moderátorský přístup k DB. Ta poznámka je zcela irelevantní.

Pokud při selectu použiješ stejně čuněcí styl jako při vkládání, tedy
SELECT cislo FROM pokus WHERE cislo<="9000" AND cislo>="4000"
Nesmaž se mi to podsouvat. O řetězci v dotazu jsem se vůbec nezmiňoval. To jste sem přitáhli naprosto nesouvisející problém.

Netuším, co se snažíš dokázat.
Snažil jsem se dokázat, že není pravda, že při uložení v textovém typu změní výsledek dotazu na DB.
A teď jen nechci, abys měl poslední slovo, protože jsi mě chybně poučoval. Chtěl bych, aby sis v ostatních vláknech nejprve ověřil pravdivost slov, než je začneš označovat za nesmysly.
jtfcobra
Profil
kokolino:
Pouzil jsem tohle a zatim funguje

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: