Autor Zpráva
unlucky
Profil
Vzorek:
id - text
1 - jedna
2- dva
3- tri
4-ctyri
5-pet
6-sest
7-sedm
8-osm
9-devet

Chci zobrazit clanek s id 6 a k tomu 3 novejsi a 3 starsi, tedy:
id: 3,4,5 6 7,8,9.
Normalne bych na to pouzil 3 dotazy, 1 pro clanek, 1 pro starsi a 1 pro novejsi. Lze to vsechno dat do jednoho dotazu?
Tori
Profil
Pokud jsou řazené podle ID, tak je to jednoduché*. Pokud podle jiného sloupce, viz Některé časteji řešené dotazy pro MySQL - FAQ » Data pro další a předchozí záznam vůči $id, když jsou položky seřazeny podle jiného sloupečku než id

* = taky union, ale bez joinů.
Joker
Profil
unlucky:
Chci zobrazit clanek s id 6 a k tomu 3 novejsi a 3 starsi, tedy:
id: 3,4,5 6 7,8,9.
Podle čeho se poznají ty nejstarší a nejnovější?
unlucky
Profil
Joker:
nikoli nejstarsi ci nejnovesi, pouze starsi a novejsi. Podle id
unlucky
Profil
rozhodl jsem se, ze na to pouziju jiny dotaz. Bohuzel mi ale nefunguje. NeZobrazuje se mi 6 zaznamu.

(select w.id,w.word from word w left join interpretation i on 
i.word_id=w.id 
where i.from_lang='en' and i.to_lang='cz' and w.id<229 limit 3)
union
(select w.id,w.word from word w left join interpretation i on 
i.word_id=w.id 
where i.from_lang='en' and i.to_lang='cz' and w.id>229 limit 3)
order by id asc
Jan Tvrdík
Profil
unlucky:
Nemělo by order by id asc být v každém z těch dvou poddotazů? Teď řadíš až výsledek toho union.
Kajman
Profil
unlucky:
NeZobrazuje se mi 6 zaznamu

Což se může stát, pokud tam není tolik odpovídajících záznamů.

V první závorce chybí order by w.id desc, v druhé order by w.id asc.
Vnější spojení postrádá smyslu, když použijete ve where podmínku na připojený sloupec.
Pokud může být k jednomu slovu více interpretací, tak by to chtělo použít distinct v obou závorkách.
Osobně bych použil union all, ať se nemusí kontrolovat shody, které by neměly nastat.
unlucky
Profil
Kajman:
Odpovidajici zaznamy tam urcite jsou.

(select w.id,w.word from word w left join interpretation i on 
i.word_id=w.id 
where i.from_lang='en' and i.to_lang='cz' and w.id<299 order by w.id desc limit 3)
union
(select w.id,w.word from word w left join interpretation i on 
i.word_id=w.id 
where i.from_lang='en' and i.to_lang='cz' and w.id>299 order by w.id asc limit 3 )
tot mi zobrazuje jenom 2, a to 298 a 300
unlucky
Profil
Musel jsem pridat distinct a uz to funguje
(select distinct w.id,w.word from word w left join interpretation i on 
i.word_id=w.id 
where i.from_lang='en' and i.to_lang='cz' and w.id<299 order by w.id desc limit 3)
union
(select distinct w.id,w.word from word w left join interpretation i on 
i.word_id=w.id 
where i.from_lang='en' and i.to_lang='cz' and w.id>299 order by w.id asc limit 3 )

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: