Autor | Zpráva | ||
---|---|---|---|
smiesek Profil |
#1 · Zasláno: 7. 4. 2015, 18:41:41
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 |
#2 · Zasláno: 7. 4. 2015, 18:46:54
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 |
#3 · Zasláno: 7. 4. 2015, 20:53:29
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 |
#4 · Zasláno: 7. 4. 2015, 21:06:56
A co to řadit ještě podle délky textu?
SELECT * FROM data ORDER BY LENGTH(cislo), cislo |
||
Joker Profil |
#5 · Zasláno: 7. 4. 2015, 21:21:07
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 |
#6 · Zasláno: 7. 4. 2015, 22:45:39
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 |
#7 · Zasláno: 7. 4. 2015, 23:03:31
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 |
#9 · Zasláno: 8. 4. 2015, 08:59:58
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 |
#10 · Zasláno: 8. 4. 2015, 09:12:16
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 |
#11 · Zasláno: 8. 4. 2015, 09:20:46
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 |
#12 · Zasláno: 9. 4. 2015, 05:44:03
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 |
#13 · Zasláno: 9. 4. 2015, 07:12:15
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 |
#14 · Zasláno: 9. 4. 2015, 15:36:14
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 |
#15 · Zasláno: 9. 4. 2015, 16:25:17
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 |
#16 · Zasláno: 9. 4. 2015, 16:34:34
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 |
#17 · Zasláno: 9. 4. 2015, 16:42:40
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 |
#18 · Zasláno: 9. 4. 2015, 18:17:12
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 |
#19 · Zasláno: 9. 4. 2015, 18:19:56
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 |
#20 · Zasláno: 9. 4. 2015, 20:02:35
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 |
#21 · Zasláno: 10. 4. 2015, 01:53:29
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 |
#23 · Zasláno: 10. 4. 2015, 03:40:41
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 |
#24 · Zasláno: 10. 4. 2015, 13:10:58
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 |
#25 · Zasláno: 12. 4. 2015, 12:47:44
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ě |
||
Časová prodleva: 10 let
|
0