Portál AbcLinuxu, 10. května 2025 14:20
select * from data; +----------+----------+ | sloupecA | sloupecB | +----------+----------+ | 1 | 11 | | 2 | 22 | | 3 | 33 | | 4 | 44 | | 5 | 55 | +----------+----------+Potřebuji napsat select tak, aby mi vystup ze sloupce A nahodne promýchal (případně sloupec B také). příkaz "select * from data order by rand();" promýchá komplet všechny řádky, ale já bych je potřeboval mít i mezi sloupci promíchané... Jak na to?
+----------+----------+ | sloupecA | sloupecB | +----------+----------+ | 2 | 44 | | 4 | 33 | | 1 | 55 | | 5 | 11 | | 3 | 22 | +----------+----------+staci mi prohazet jen jeden sloupec...
ak vám nevadí karteziánsky súčin, tak:
select a.a, b.b from tab a, tab b order by random ()
create table a (id serial, refid int); insert into a (refid) select id from table order by random ()
, dtto b), a potom select from ta.A, tb.b from table ta, table tb, a, b where a.id = b.id and a.refid = ta.id and b.refid = tb.id
to už radšej v aplikácii si vytvoriť dva kurzory na dva random selecty jedntlivých stĺpcov.
Jinak pokud to neni potreba delat nutne v SQL, udelal bych to az v aplikacni vrstve, tam to prehazet preci neni problem a dokonce bych rekl, ze to bude vypocetne uspornejsi.No, tak jako já nevím. Databáze je specializovaný program pro manipulaci s daty…
Mozna trochu prehnane reseni, ale delal bych to pres docasne tabulky.Zbytečná režije, pokud není třeba si ten "pomíchaný" stav pamatovat. Ale dočasné tabulky se většinou s koncem transakce čistí, takže nevím… Já bych si otevřel dva kurzory, jak už někdo psal: jeden jako
SELECT sloupecA FROM tabulka ORDER BY DBMS_RANDOM.NORMALa druhý úplně stejný, akorát s druhým sloupcem. Dokonce si myslím, že vzhledem k tomu, že pořadí řádků není garantováno, tak by u druhého kurzoru vůbec nemusel být ten
ORDER BY DBMS_RANDOM.NORMAL
…
No, tak jako já nevím. Databáze je specializovaný program pro manipulaci s daty…Na ukládání dat a nějakou relační algebru. Vycházet z takovýchto "hesel" není úplně dobré.
SELECT data.sloupecA, data2.sloupecB FROM data, (SELECT sloupecB FROM data ORDER BY rand() LIMIT 1) AS data2Ale to vám nezaručí, že se hodnoty ze sloupceB nebudou opakovat. Pokoušíte se ale o dost zvláštní věc, a nejspíš děláte něco špatně – buď máte špatně strukturu tabulky, nebo se pokoušíte v databázi řešit něco, co by měla dělat aplikace.
Pokoušíte se ale o dost zvláštní věc, a nejspíš děláte něco špatněNo, dovedu si představit případ, kdy se to hodí
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.