Autor Zpráva
Pavel Dumbrovský
Profil
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
Pavel Dumbrovský:
Teď si nejsem 100% jist, ale nepomohlo by toto:
ORDER BY SUBSTR(produkty, 3)
Pavel Dumbrovský
Profil
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
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
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
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
Pavel Dumbrovský:
můžeš vyjmenovávat sloupce, které chceš:
SELECT sloupec1, sloupec2, sloupec3 from tabulka
Medvídek
Profil
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
Aha, no já jsem hlavně nevěděl, že jde dát select *, id from tabulka..
TomášK
Profil
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
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
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
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
Pavel Dumbrovský:
Přetypovat ten řetězec na číslo bude fungovat. Ale rychlé to nebude.
Jozin
Profil
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
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
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 :)

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