Autor Zpráva
smiesek
Profil
Netušila jsem kam přesně zadat dotaz a jak jej nazvat.
Z databáze vypisuju záznamy, které mají číselné značení 1-..., mám tedy pak následující položky, které pokud dotazem ORDER BY seřadím vzestupně, nebo sestupně, to je jedno, se seřadí následovně:
17, 18, 20, 21, 277, 278, 280, 29, 31 ...

Jde mi o to, že nevím jak vyřešit, aby se to řadilo jako
17, 18, 20, 21, 29, 31, 277, 278, 280

Jelikož jde o označení, kde mohou být i písmena a pomlčky (A-09 nebo SNIP 23), mám formát sloupce pro označení v DB jako typ varchar.

Děkuju za doporučení a radu.
Taps
Profil
smiesek:
Podle mě by bylo nejvhodnější vyseparovat číselné údaje a umístit je do zvláštního sloupečku. Sloupečku přiřadit typ INT.

Další možnost je, že si z databáze vytáhneš údaje a seřazení provedeš na úrovni PHP
Joker
Profil
smiesek:

Dobré řešení by bylo používat pro čísla číselný sloupec.

Pokud to z nějakého důvodu nejde, asi by fungovalo řadit podle čísla doplněného zleva nulami na délku nejvyššího uložitelného čísla (pokud jde o MySQL, viz LPAD).
smitka
Profil
A co to řadit ještě podle délky textu?

SELECT * FROM data ORDER BY LENGTH(cislo), cislo
Joker
Profil
Ještě je otázka, jestli to číslo může být i záporné. V tom případě by nefungovala ani ta moje metoda, ani ta podle [#4] smitka.
Kajman
Profil
smitka:
A co to řadit ještě podle délky textu?

Jestli nevadí, že A-09 nebo SNIP 23 můžou být špatně seřazené a že to bude pomalé, tak to použijte.

Pokud to má být řazené korektně a s možností využití indexu, použijte druhý sloupec na čísla a v původním si nechte nečíselné hodnoty. Pro řazení použijte postupně oba sloupce.
juriad
Profil
Také by mohlo jít zneužít CONVERT k přetypování prefixu na číslo.
sqlfiddle.com/#!9/9eecb/5441
Otázkou je, jak rychlé to bude; určitě to není správné řešení. Mimochodem, ten CONVERT by šel použít jednorázové k naplnění toho číselného sloupce.
smiesek
Profil
obávám se, že nepomůže ani LENGHT, protože mi to neseřadí se dle čísla korektně.
seřadilo se to jako - 25,20,31,29,21,17

Číslo nikdy záporné nebude, pouze kladné a nebo doplněné o písmeno, jde o databázi položek, které mají předem dané číslování.
Položky jsou 1-...xxx nebo taky různé jako AS-01...AS-10 nebo RJ01...RJ20

Jde mi především o to číselné seřazení.

Takže možná asi budu muset před ty čísla doplnit 00 pro DB a následně je ve výpisu nezobrazovat a pak by to asi mělo už fungovat?
Kajman
Profil
smiesek:
nepomůže ani LENGHT, protože mi to neseřadí se dle čísla korektně

Asi tam budou nějaké mezery nebo něco takového, zkuste řešení s funkcí convert [#7].
smiesek
Profil
Kajman: kouknu na to. Ty mezery tam určitě žádné nebudou :(
Tu funkci musím nejprve tedy nastudovat, jak se s tím zachází a jak se provádí úprava.

Jak na to příjdu a zkusím použít, napíšu zdali pomohlo.
Keeehi
Profil
Já jsem za druhý sloupec jak už psal Kajman v [#6]. Je tam trochu nepříjemná ta závislost dvou sloupců ale bude to stabilnější (dá se toho méně pokazit) a získáš tím rychlost které v jiných případech nedosáhneš.
smiesek
Profil
Keeehi: pokud bych přidala druhý sloupec, znamená to, že při vkládání do databáze za pomocí formuláře ale budu muset mít tím pádem ještě jedno pole formuláře.
Tedy bude ve formuláři pole jak pro číselné označení, tak textové, chápu správně?
Keeehi
Profil
smiesek:
To vůbec nebude potřeba.

<input type="text" name="myInput">

<?php
$myInputValue = isset($_POST["myInput"]) ? $_POST["myInput"] : '';
$myInputIntegerExtracted = preg_replace('~\D~', '', $myInputValue);
if($myInputIntegerExtracted === '') {
    $myInputIntegerExtracted  = "NULL";
}

$sql = "INSERT INTO table VALUES ('".databaseStringEscapeFunction($myInputValue)."', $myInputIntegerExtracted)";

3. řádek z toho vstupu smaže všechno co není číslo.
smiesek
Profil
Keeehi:
hm jenže já nechcu přijít o data, která nemají číslo, já potřebuju vypisovat všechny, jen se mi prostě ta čísla neřadí jako čísla.

Z toho co jste napsal stejně nerozumím, jak tu použít pro své účely :( takže to budu asi jako osel nějak packat přes formulář jako druhé pole nebo pak nevím. Nemám zase tak logické myšlení no
_es
Profil
smiesek:
jen se mi prostě ta čísla neřadí jako čísla.
Pretože to nie sú čísla ale text. Ak to majú byť čísla, tak si ich ulož do databázy ako čísla.
Tomáš123
Profil
smiesek:
Užívateľ zadá vstup do jedného políčka, regulárnym výrazom sa do novej premennej uložia iba číselné znaky z pôvodného raťazca a následne sa obidve premenné uložia do databázy (s tým, že hodnoty budú v rozličných stĺpcoch).
juriad
Profil
smiesek:
A napadlo tě triviální řešení, že by tam uživatel doplnil nuly na začátek? Tedy, že by vložil místo 1-xxx raději 01-xxx?
smiesek
Profil
juriad: na to jsem se ptala již výše, zdali by nepomohlo pouze psát před čísla 0 a následně při výpisu je nezobrazovat?

Tomáš123: to je na mě moc složité, nevidím v tom postup použití :(

_es: ano, prej mám používat dva sloupce, ale já to umím jedině asi s použitím 2 políček, nikoliv jednoho :(
juriad
Profil
Ano to bude fungovat. Ale nevím proč chceš něco skrývat. Uživatel ti pak řekne, že nefunguje nějaké ID, a ty nebudeš tušit, kolik nul máš na začátek doplnit.
_es
Profil
smiesek:
já to umím jedině asi s použitím 2 políček, nikoliv jednoho
Počet „políčok“ predsa nemusí zodpovedať počtu stĺpcov v tabuľke.
Keeehi
Profil
V příspěvku [#13] jsem popsal postup, jak z jednoho políčka formuláře dotaz data do dvou různých sloupců v databázi. Jestli ti v tom příkladu není něco jasné, tak se neboj zeptat.
smiesek
Profil
no celkově nevím jak to upravit a zapracovat dle příkladu, podobu svého pole formuláře mám jako
                        <tr>
                            <td class="popis">Označení:</td>
                            <td class="data"><input type="text" size="15" name="oznaceni" value="' .$data['oznaceni']. '" maxlength="15" /></td>
                            <td class="chyba">' .$error['oznaceni']. '</td>
                        </tr>

jediné co ještě nyní zvládnu je snad přejmenování sloupce oznaceni na:

oznaceni_cislo = typ int
oznaceni_text = typ varchar
Keeehi
Profil
smiesek:
Podle tohoto kódu je potřeba v přikladu upravit jen druhý řádek.
$myInputValue = isset($_POST["oznaceni"]) ? $_POST["oznaceni"] : '';

+ Podle toho zda se formulář posílá jako get nebo post je požeba na druhém řádku případně zaměnit POST za GET..
+ V části, kde se to ukládá do databáze je potřeba do dotazu přidat ten nový sloupec a hodnota pro něj je v $myInputIntegerExtracted
smiesek
Profil
Keeehi: bohužel nerozumím ani jedné části úpravě a proto to nemohu použít a ani využít Vašich rad.

Děkuju i tak za pomoc a alespoň tedy vysvětlení, že mi to nefunguje řazení a ani není možnost to spravit
smiesek
Profil
zatím jsem se to tedy snažila vyřešit pomocí
Order by right(concat("0000000000", sortField), 10)

což nyní seřadí napřed čísla - to je OK již a následně písmena, přesto by mě ještě zajímalo, jestli lze ještě nějak doplnit o úpravu řazení napřed písmena a pak ta čísla...
Použitím DESC to není řešením, to se mi seřadí právě i ta čísla, která by měla zůstat vzestupně

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:

0