Ahoj
mám zvláštní dotaz, je možné nějak jednoduše aplikovat řazení dat z DB tak že mám ve sloupci záznamy jedničky a nuly, klasicky ho řadím order by sloupek asc a dostanu výsledek 00000111111, potřeboval bych něco jako order by sloupek cikcak abych dostal výsledek 010101010101
potřebuju mít podle tohohle sloupečku rozházený výsledky
Díky za pomoc
M
Nelze, protože řazení znamená uspořádání množiny tak, ze prvky jsou v relaci "menší než", která je tranzitivní, reflexivní a asymetrická. To ta tebou popsaná není. Budeš to muset udělat programově.
nejlepsi by bylo kdybys mluvil konkretne, je totiz mozne, ze ti dokazeme navrhnout lepsi reseni... na tohle konkretne me napada jen predradit si to v php a takto razeny index si v podstate preulozit do vedlejsi tabulky a vybirat joinem ... problem ej ze se to musi znovu radit pri kazde zmene, to muze byt dost narocne :)
napadá mě jen hodit si do proměnný počet těch řádků v tabulce a pak to jakoby vybírat po jednom (jakože jednu query WHERE cislo = '1', druhou WHERE cislo = '2') a opakovat to (počtem řádků / dvěma) a nastavovat postupně offset (jakože na začátku foreach $num = 1; a na konci $num++; a offset = $num ... ale možná mluvim z cesty, ani nevím, jestli je to takto realizovatelné...jestli je to blbost, tak mě někdo okřikněte :)
to je zbytecne prekombinovane. Pokud to uz bude resit mimo db, tak mu staci jeden dotaz bez ohledu na sloupec number a nasledne provest razeni rucne, usetri tak jeden dotaz
rand právě použít nemůžu, protože i když je to přeházený, tak to není náhodné
---------- Příspěvek doplněn 11.08.2011 v 00:09 ----------
Původně odeslal naniccz
Nelze, protože řazení znamená uspořádání množiny tak, ze prvky jsou v relaci "menší než", která je tranzitivní, reflexivní a asymetrická. To ta tebou popsaná není. Budeš to muset udělat programově.
no napsal jsem řazení, ale myslel jsem uspořádání podle určitých pravidel
---------- Příspěvek doplněn 11.08.2011 v 00:11 ----------
děkuju za nápady, doufal jsem že existuje nějaká vychytávka která to udělá, ale už do začátku jsem o tom dost pochyboval :-)
Podle mého názoru je řešení se dvěma oddělenými dotazy elegantnější.
Naopak, si myslím, že řadit v paměti neseřazený výpis znamená zbytečné zatížení paměti, CPU a extra kód (který si nota bene neporadí se stránkováním, pokud tam má být) a navíc s prospektem zavlečení chyb v něm. Taktéž to znamená extra čas pro vykonání řazení ve skriptu, které by místo toho mohlo/mělo být přeneseno na databázový engine (který je na to optimalizován).
no napsal jsem řazení, ale myslel jsem uspořádání podle určitých pravidel
To je opravdu vtipné, když chceš radu, nepopíšeš problém, resp popíšeš ho na nečem jiném a když ti tu lidi radí jak to udělat cikcak, tak se dozví, že to je uspořádané podle pravidel, které jsi ale nespecifikoval.
Jasně definuj co chceš, na spoustu věcí je vychytávka. Ale to jak se ptáš je stylem "Chci tříkolku ... hmm jdi do obchodu pro tříkolky ... nojo ale možná by měla mít 4 kola ... to není tříkolka ... no ale hlavně aby to plavalo na vodě při rybaření, myslel jsem že na takové tříkolky jsou speciální obchody".
pro: duben
to že si dotaz nepochopil je jistě dobrá záminka psát vtipné poznámky ;-)
ostatní kteří dotaz pochopili a znali odpověď už k tomu své názory napsali
děkuji ti za důležitý příspěvek :)
Místo, abyste Standu urážel, by vás jeho příspěvek mohl nakopnout k tomu, že správné zadání problému je velmi důležité, a vy jste ho podcenil.
Příště svůj dotaz formulujte přesněji. Uvidíte, že to pomůže i vám, nejen těm, kdo tráví svůj čas tím, že vám chtějí pomoct.
---------- Příspěvek doplněn 05.11.2011 v 12:14 ----------
je fakt obdivuhodný že si dělá starosti s mým problémem :) ale když se mu můj dotaz nezdá tak ať napíše že mu to mám popsat líp, nebo ať neodpovídá, k tomu aby mi pomáhal ho nenutím.
---------- Příspěvek doplněn 05.11.2011 v 12:32 ----------
všimněte si že na Vaši otázku "Čeho konkrétně chcete docílit?" jsem nijak neobvykle nereagoval, protože jste podal konstruktivní dotaz a já si uvědomil že mé zadání bylo dost odbyté. Nevím proč je potřeba aby nějakej "borec" Standa na druhý vyskakoval, on taky neví co umím, nebo neumím a nemusí si nic dokazovat, tím spíš je smutné že někdo kdo toho ví podle Vašeho názoru dost, si vyskakuje na někoho o kom si může myslet že nic neumí, tím rozhodně neukazuje svojí sílu, ale to jakej je trouba, i když s hromadou znalostí
a jestli je opravdu takovej borec tak ať mi napíše řešení.
mám tabulku se dvěma sloupci.
v jednom sloupci je název města, ve druhém sloupci je jméno obyvatele
chci vypsat seznam všech obyvatel ze všech měst
mám zadaná města, praha, brno, ostrava
ve městě praha bydlí agáta, bedřich, cecílie
v brně bydlí david, emil, franta, gustav, harold
v ostravě ivan, jindřich
jména budou řazeny dle abecedy
jenže chci aby se nejdřív řadily podle měst a to tak, že města se budou pravidelně střídat
výsledek tedy bude
brno ... david
praha ... agáta
ostrava ... ivan
brno ... emil
praha ... bedřich
ostrava ... jindřich
brno ... franta
praha... cecílie
brno ... gustav
brno ... harold
vtip je v tom že nechci použít jiný kód než výsledek SQL, nejlépe jediný dotaz
otázku jsem dal protože jsem zjišťoval jestli neexistuje nějaké jednoduché řešení, další příklad berte s velikou rezervou (to znamená že nepotřebuje vtipné narážky je to JENOM jako)
select mesto, jmeno from tabulka order by mesto stridave asc, jmeno asc
!!! jakákoli informace o tom, že to jde rozdělit do více dotazů, použít kód který si dále s výsledkem pohraje a výstup bude podle požadavku nepotřebuji, protože s tím si dokážu poradit, primárně hledám řešení které je jednoduché jako výše uvedený příklad, můj dotaz je jde to tak jak jsem to nastřelil? možné odpovědi ANO/NE
Snad už to pochopí i ti vtipnější z přispěvovatelů
mnosavcov
Míň machrování a víc sebereflexe, když po někom něco chceš a neumíš se ani správně zeptat by neškodilo. Nemělo cenu abych psal jinou než veselou poznámku, protože ostatní předemnou ti už jasně napsali, že zadání bylo nedostatečné. Po tom co jsi tu rozepsal, je jasné, že jsi ve skutečnosti chtěl něco naprosto jiného než vyplývalo z tvého první dotazu. Nehledě na to, že zadání jsi napsal špatně (ostrava je abecedně před prahou) a že si mě jízlivě dobíráš a čekáš zdarma radu na ne zrovna triviální otázku, ti jako "trouba s hromadou znalostí" pomůžu. Nezadal jsi v rámci své euforii o tom jak jsem "vtipný a machruju" nad jakou databází má SQL kód běžet. Tohle jde řešit pomocí rozšiřujících SQL funkcí, které má každý sql interpret (MySQL, SQL, PSQL) jiné. V řešení tedy vycházím z toho, že používáš mezi webtržníky nejběžnější MySQL.
1) triviální řešení neexistuje, protože cikcak řazení neodpovídá logice množinovému zpracování dat (případný tip ke studiu, relace a množinové operace)
2) nevím proč to takhle potřebuješ, ale řešení v kódu je většinou praktičtější
3) vhodné řešení na úrovni databáze je pomocí triggerů, při ukládání dat na INSERT TRIGGERU
4) funkční řešení existuje a je popsáno níže
Aby ses mohl ty nebo kdokoliv jiný, kdo se bude chtít něco přiučit mohl kód vyzkoušet rovnou přikládám ostatní potřebné scripty:
Script na vytvoření testovací tabulky
INSERT INTO tabulka (mesto, jmeno)
VALUES ('brno', 'gustav');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('brno', 'harold');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('brno', 'franta');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('brno', 'david');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('brno', 'emil');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('praha', 'cecílie');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('praha', 'agáta');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('praha', 'bedřich');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('ostrava', 'ivan');
INSERT INTO tabulka (mesto, jmeno)
VALUES ('ostrava', 'jindřich');
SQL kód, který dělá to co chceš, vzhledem k tomu, že chceš něco co normálně udělat nejde, má to řešení určité omezení. Tohle řešení bude fungovat pouze do 10ti měst, pokud to budeš chtít rozšířit o řád, je potřeba v kódu změnit výskyt kus kódu kde je
místo na 10 na 100x, o další řád 1000x atd. Bohužel MySQL neumí v rankovací funkci násobení. Pro hezčí řešení je udělat variable tabulku, nebo stálou pomocnou tabulku, do ní vložit 1, 10, 100 atd... a to JOINovat a přičítat. Případně nejprve zjistit počet měst a podle toho použít generátor SQL kódu, který opakování zajistí, nebo použije vhodně proměnou. Nicméně to už je jen způsob jak udělat řešení o něco hezčí, na funkčnost vliv nemá.
A teď finální kód
Kód:
SET @rank = 0, @prev_val = NULL, @rankvalue = 10;
SELECT mesto, jmeno, rank
FROM (
SELECT
@rank := IF(@prev_val!=jm.mesto,1,@rank+@rank+@rank+@rank+@rank+@rank+@rank+@rank+@rank+@rank+1) AS rank,
@prev_val := jm.mesto,
jm.jmeno,
jm.mesto
FROM
(SELECT jmeno, mesto
FROM tabulka
ORDER BY jmeno, mesto) jm
JOIN
(SELECT mesto, @curRank := @curRank + 1 AS mestorank
FROM
(SELECT DISTINCT mesto FROM tabulka) t, (SELECT @curRank := 0) r
ORDER BY mesto) mr
ON jm.mesto = mr.mesto
) final
ORDER BY rank, mesto, jmeno
Když budeš chtít vtipnějšímu přispěvovateli poděkovat za asi 2 hodiny práce, tak na http://www.duben.org najdeš můj paypal účet, jinak je tu plus u příspěvku.
ahoj, omlouvám se :)
v ten den kdy jsem to četl mi to nějak nesedlo a trochu jsem se rozjel. No v každym případě klobouk dolu, že sis s tim dal tolik práce. Snad to tady někdo najde a bude mu tahle informace užitečná. Jinak já to nakonec vyřešil už dřív lehce primitivně a to že jsem na konec dotazu připojil --- order by rand(<náhodné_číslo_pro_vybrané_parametry_vž dy_stejné>) --- takže je to přeházené a dá se to stránkovat, nakonec jsme se dohodli že to nemusí být pravidelné
M