Autor | Zpráva | ||
---|---|---|---|
Pavel Dumbrovský Profil |
#1 · Zasláno: 23. 6. 2011, 12:55:13
Dobrý den,
mám problém se řazením dat, kdy máme skladová čísla produktů, která se seřadí takto: SG 76, SG 760, SG 765, SG 77,.. což je pro nás špatné, potřebovali bychom to řadit podle těch čísel, jakoby tam nebylo to SG. Ovšem sloupec je VARCHAR, lze to nějak udělat, aby to řadilo podle těch číslic? Počítám, že když bych předělal sloupec na INT, tak to SG už by tam asi nešlo.. :)) Díky. |
||
Medvídek Profil |
#2 · Zasláno: 23. 6. 2011, 13:00:42 · Upravil/a: Medvídek
Pavel Dumbrovský:
Teď si nejsem 100% jist, ale nepomohlo by toto: ORDER BY SUBSTR(produkty, 3) |
||
Pavel Dumbrovský Profil |
#3 · Zasláno: 23. 6. 2011, 13:05:21
Noo ono je to trochu složitější, asi jsem měl napsat, že SG není jediná možnost, jsou tam tisíce produktů jako např LG 1, LG 14, SD 23, LP 34, MX 23, atd..
Takže bych to chtěl seřadit primárně podle těch písmen a pak podle čísel.. |
||
Jozin Profil |
#4 · Zasláno: 23. 6. 2011, 13:12:31
Pavel Dumbrovský:
To je ale chyba návrhu tabulky. Měl tam být sloupec značka a další sloupec třeba označení. Spíš než řešit obludné dotazy zkus popřemýšlet nad tím, že by sis napsal script na předělání tabulky. Nebude to tak těžké. 1. krok: přejmenovat stávající tabulku 2. krok: vytvořit novou tabulku 3. krok: vybrat všechny data z původní tabulky ty zpracovat a vložit do nové tabulky |
||
Medvídek Profil |
#5 · Zasláno: 23. 6. 2011, 13:15:49 · Upravil/a: Medvídek
Pavel Dumbrovský:
Tak sem to zkusil takto $data=mysql_query(" SELECT id, nazev, SUBSTR(kod, 1, 2) AS kod, SUBSTR(kod, 3) AS cislo FROM zkus ORDER BY kod ASC, cislo ASC "); while($d=mysql_fetch_array($data, MYSQL_ASSOC)){ echo "<pre>"; print_r($d); echo "</pre>"; } Struktura DB: CREATE TABLE IF NOT EXISTS `zkus` ( `id` int(11) NOT NULL auto_increment, `nazev` varchar(50) collate utf8_czech_ci NOT NULL, `kod` varchar(50) collate utf8_czech_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=5 ; -- -- Vypisuji data pro tabulku `zkus` -- INSERT INTO `zkus` (`id`, `nazev`, `kod`) VALUES (1, 'produkt 1', 'SG 1566'), (2, 'produkt 2', 'SG 6588'), (3, 'produkt 3', 'ZN 65888'), (4, 'produkt 4', 'AL 5855'); |
||
Pavel Dumbrovský Profil |
#6 · Zasláno: 23. 6. 2011, 13:50:50
Díky,
to vypadá dobře. Jen bych měl ještě dotaz, selectuju tam z více tabulek naráz a vybírám *, v tabulkách je dost velký množství sloupců. Je nějaká alternativa jak to udělat za použítí select *? Asi ne co.. Že by se to filtrovalo až u toho orderu by.. |
||
Jozin Profil |
#7 · Zasláno: 23. 6. 2011, 13:55:37
Pavel Dumbrovský:
můžeš vyjmenovávat sloupce, které chceš: SELECT sloupec1, sloupec2, sloupec3 from tabulka |
||
Medvídek Profil |
#8 · Zasláno: 23. 6. 2011, 13:57:10
Pavel Dumbrovský:
Pokud sem pochopil, tak vypisujete z více tabulek. Mělo by stačit normálně vybrat vše. SELECT tabulka1.*, tabulka2.*, tabulka3.*, SUBSTR(tabulka1.kod, 1, 2) AS kod, SUBSTR(tabulka1.kod, 3) AS cislo .... To bude fungovat jen pokud jsou produkty v jedné tabulce a z ostatních taháte jiná data. |
||
Pavel Dumbrovský Profil |
#9 · Zasláno: 23. 6. 2011, 14:00:02
Aha, no já jsem hlavně nevěděl, že jde dát select *, id from tabulka..
|
||
TomášK Profil |
#10 · Zasláno: 23. 6. 2011, 14:03:49
Dobře to jen vypadá, ale pořád to řadí čísla jako řetězce. Viz následující výstup, který má špatně seřazené řádky 2,3.
+----+-----------+-----+--------+ | id | nazev | kod | cislo | +----+-----------+-----+--------+ | 4 | produkt 4 | AL | 5855 | | 1 | produkt 1 | SG | 1566 | | 2 | produkt 2 | SG | 658 | | 3 | produkt 3 | ZN | 65888 | +----+-----------+-----+--------+ Řešení už tu bylo navrženo, viz [#4] |
||
Pavel Dumbrovský Profil |
#11 · Zasláno: 23. 6. 2011, 14:13:07
Hm, to je blbý, jenže navrhované řešení je dost komplikované, vzhledem k danému systému. Jedná se o obří e-shop, který jsem nedělal já, jen mám nyní předělat řazení.. :)
|
||
Jozin Profil |
#12 · Zasláno: 23. 6. 2011, 14:15:31
Pavel Dumbrovský:
Pro PHP programátora by neměl být problém... pokud se všude ovšem používá select * from... a pak se vychazí z toho, že i výrobce i ten kód je ve stejném sloupci, pak to problém opravdu být může. Jestli to jinak nejde, tak prostě vyber, jak to má být... a pomocí php to seřadit... bude to ale obludné. |
||
Pavel Dumbrovský Profil |
#13 · Zasláno: 23. 6. 2011, 14:17:58
Co to zkloubit s tímto?
http://stackoverflow.com/questions/119730/how-do-i-sort-a-varchar-column-in-sql-server-that-contains-numbers Poslední odpověd dole.. |
||
TomášK Profil |
#14 · Zasláno: 23. 6. 2011, 14:22:53
Pavel Dumbrovský:
Přetypovat ten řetězec na číslo bude fungovat. Ale rychlé to nebude. |
||
Jozin Profil |
#15 · Zasláno: 23. 6. 2011, 14:24:47
Pavel Dumbrovský:
Vyzkoušet to můžeš... možná to bude i fungovat. Já jsem se na to koukal, když jsi to tu začínal psát, ale než jsem to dočetl, tak mě napadlo, že je to špatně navržené. SELECT tabulka1.*, tabulka2.*, tabulka3.*, SUBSTR(tabulka1.kod, 1, 2) AS kod, CONVERT(intm tabulka1.kod) AS cislo ... asi tak |
||
Pavel Dumbrovský Profil |
#16 · Zasláno: 23. 6. 2011, 14:28:00
Njn, ale bude pro mě časově nejlepší řešení a pro klienta nejlevnější a to se počítá.. :) Zatím
Všem zatím děkuji! |
||
Medvídek Profil |
#17 · Zasláno: 23. 6. 2011, 14:30:31 · Upravil/a: Medvídek
TomášK:
Tak akorát přetypovat na číslo. SELECT id, nazev, SUBSTR(kod, 1, 2) AS kod, CAST(SUBSTR(kod, 3) AS DECIMAL(50,0)) AS cislo FROM zkus ORDER BY kod ASC, cislo ASC EDIT: Aha, koukám, že se to už řešilo :) |
||
Časová prodleva: 13 let
|
0