Autor Zpráva
Karel_
Profil *
Ahoj,

nevím zda směřovat svůj dotaz sem nebo do databází, ale pisnu sem :-). Mám v databázi uložená data, která se vypisují ať už dodle data či id (jsou řazeny od nejnovešího směrem dolů, "žádná novina"). Ale problém nastává, kdybych chtěl určitý článek mít furt na pozici číslo 1. př: z databáze vypíšu posledních 5 článků, 1, 2, 3, 4, 5, ale já bych chtěl aby se článek s pořadovým číslem 3 vyskytoval furt na pozici číslo jedna. Doufám, že mi rozumíte a děkuji za radu :-)
MzM
Profil
select * from clanky where id=3 -- toto chci furt
union
select * from clanky where id <> 3 order by limit .... -- zbytek.

takto jsi to myslel?
DJ Miky
Profil
Jde to také vytvořením nového sloupce, třeba "dulezite", tomu jednomu nastavit na 1 a ostatním na 0, pak stačí už jen:
SELECT * FROM novinky ORDER BY dulezite DESC, id DESC LIMIT 0,5
Karel_
Profil *
no teď to mám takhle
 SELECT * FROM clanky WHERE uverejnit=ano ORDER BY id DESC LIMIT 15


no pak jsem to zkoušl podle toho union jak poradil MzM to mi hází chybu, kouk jsem i do manuálu, ale ještě stále se učím :-)

zkoušel jsem takto ale nejde:
("SELECT * FROM clanky WHERE uverejnit=ano AND id=28 ORDER BY id DESC LIMIT 1") UNION ("SELECT * FROM clanky WHERE uverejnit=ano AND id <> 28 ORDER BY id DESC LIMIT 15");


hází chybu
YoSarin
Profil
Nejsystematičtější řešení je to co psal DJ Miky (možná by to šlo ještě líp, ale kdo ví), V tom UNION máš špatně uvozovky - vůbec tam nemají být.
Karel_
Profil *
YoSarin
tak bylo by to asi lepší, ale s výpisem by to bylo asi složitější :-(
DJ Miky
Profil
ale s výpisem by to bylo asi složitější :-(

To by právě bylo jednodušší, už jsem psal, jak by to bylo možné:
SELECT * FROM novinky ORDER BY dulezite DESC, id DESC LIMIT 0,5
Karel_
Profil *
DJ Miky

už ti asi rozumím, ale jak jsem psal, začínám. Dokážu do databáze něco uložit a pak to z ní nějak vydoloval (jednoduše) mohl by jsi to prosím tě trochu rozvést. takže musím nastavit důležité 1

SELECT * FROM novinky ORDER BY dulezite=1 DESC, id DESC LIMIT 0,5
DJ Miky
Profil
ORDER BY dulezite=1 DESC

Ne, to ne, to je řazení, tam se nic nepřiřazuje.

Trochu podrobněji: Vytvoř si v tabulce nový sloupec (např. v phpMyAdminu, název např. „dulezite“, typ stačí tinyint nebo bool), kterému pro jednoduchost nastav jako základní hodnotu „0“. Té novince, kterou chceš mít navrchu, nastav hodnotu tohoto sloupce na „1“. Potom už můžeš vytahovat data dotazem, který jsem ti psal.
Karel_
Profil *
DJ Miky

šlape to krásně, děkuji moc! :-)

jen by mě zajímalo proč u dulezite nic není? jak vlastně pozná, že 1=zobraz?

vím, je to jak pro hlupáka, ale aspoň se to tak líp naučím thx :-)
MzM
Profil
DJ miky, chvilku jsem bádal nad tím "dulezite=1" a už mi to docvaklo, taková trochu finta. Pak je ale zbytečné tam strkat nový slupeček. Stačí udělat
order by id = <id_co_ma_byt_nahore> desc, id desc

šikovné řešení

Pro ostatní, aby nemusely pátrat, co to dělá:
v order by jsou výrazy, pokud tam je sloupeček, tak se ve výsledku řadí podle hodnoty, pokud tam napíšete to id = 5 (např.) tak se vyhodnotí výraz a pro id, které je skutečně 5 tam bude ve výsleku hodnota 1 jinak 0 a podle toho se to seřadí, když je tam desc, tak ta jednička bude nahoře zbytek dole, další sloupeček pak zajistí řazení vrámci těch zbylých nul.

pokud chci aby ten první řádek tam byl i pro jiné limit x, y, kde x > 1, tak se ve variantě s tím order ztratí, pak je lepší použít variantu s union.

Výpisy v php jsou u obou případů naprosto totožné
Toto téma je uzamčeno. Odpověď nelze zaslat.