Autor Zpráva
Tomiiiiikk
Profil *
Zdravím Vás, nejsem až tak znalý MySQL, měl bych jednu prosbičku. Mám tabulku např. takto:

ID, Poradi, Nazev, Popis
1, 1, Nějaké zboží, Nějaký popis
2, 2, , ,
3, 3, , ,
4, 4, Další zboží, Další popis
5, 5, , ,
6, 6, , ,
7, 7, , ,
8, 8, Další zboží2, Další popis2


Potřebuji z této tabulky vyselectovat např. to když dám do WHERE ID 1, aby mi načetl všechyn záznamy od prvního tedy ID 1 až po ID 3 (tzn. první vyplněný Nazev + vše co má pod tímto v DB nevyplněný Nazev), ID 4 a níže se tedy nebude již SELECTOVAT. Potřebuji tedy selectovat první název a další řádky, které nemají pod tímto hlavním názvem vyplněn Nazev, ale nesmí tento select pokračovat na další ID např. 4 kde již další Nazev je. LIMIT 1,3 nepřipadá v úvahu, protože budu dle ID chtít např. vyselectovat ID 4 a všechny záznamy pod ním, které nemají opět vyplněn Nazev (tedy ID od 4-7).


Děkuji za případnou radu zda-li toto lze řešit nějakým selectem
Kajman_
Profil *
A jste si jistý, že máte dobře navrženou strukturu? Čeho chcete takto dosáhnout?
Tomiiiiikk
Profil *
Kajman_

Bohužel takto to generuje jeden program a jsem si jist, že to takto bude :-( Osobně bych to řešil jinak, ale takto to zákazník chce :-(
Kajman_
Profil *
Možná něco takového, ale je to zvěrstvo. Lepší bude vysvětlit zákazníkovi, že to takhle bude pomalé a nesmyslné.

select k.*
from   tabulka k,
       (select min(t.poradi) maxlim, min(p.poradi) minlim
        from   tabulka t, (select poradi from tabulka where id = 1) p
        where  t.nazev is not null
               and t.poradi > p.poradi) l
where  k.poradi >= l.minlim
       and k.poradi < ifnull(l.maxlim,k.poradi+1)
order  by k.poradi
sysel
Profil
Pokud je vidět, sloupce ID a Poradi jsou stejné, což je zbytečné a lze sloupec Poradi použít potřebným způsobem. Krkolomnost, za kterou se Kajman_ zbytečně omlouvá, pramení z toho, že v jakýchkoliv databázích není dostatečná nebo spíš vůbec žádná podpora porovnávání dvou záznamů po sobě. Databázové tabulky pojem sekvence vlastně neznají i přes to, že se nijak nenamáhají zapomínat na postup plnění tabulky.
Nad to si lze těžko představit, co bude z tabulky vybráno, když se zadá WHERE ID = 3. Myslím, že bude prospěšnější buď přesvědčit zákazníka nebo to udělat správně i bez jeho vědomí.
Tomiiiiikk
Profil *
Kajman_

Je to zvěrsrtvo, ale bohužel, má udělaný nějaký software který mu takto do databáze generuje. Jen by mě zajímalo, proč se ten select ptá tabulky k a tabulky t :-( Já mám jen jednu tabulku se strukturou jak jsem psal nahoře :-(
Kajman_
Profil *
A nemůžete si podle té divnotabulky udělat svoje tabulky, co mají hlavu a patu?

Ale vždyť taky používám jen jednu tabulku s názvem tabulka. To t, k a tak jsou jen aliasy, aby šla použít ta samá vícekrát.
Tomiiiiiikk
Profil *
Kajman_

Aha, tak to jsem neveděl, jak jsem říkal, MySQL moc neholduju ;o) Zkusím tento select a uvidíme ;o)
Tomiiiiiikk
Profil *
Kajman_

Tak jsem to zkoušel ... Co se týká těch ID a Poradi, tak opravdu nejsou stejné ... :-( ID je ID nějaké skupiny zboží, které je stejné, pořadí je jen k tomu, aby věděl jak to seřazovat.

Omlouvám se, tabulka měla vypadat takto:

ID, Poradi, Nazev, Popis
1, 1, Nějaké zboží, Nějaký popis
1, 2, , ,
1, 3, , ,
2, 4, Další zboží, Další popis
2, 5, , ,
2, 6, , ,
2, 7, , ,
3, 8, Další zboží2, Další popis2


Můžete mi prosím upravit ten SELECT? Neselectuje mi správně, ale je to tím co jsem tady asi špatně napsal ... :-(
Kajman_
Profil *
Tak to stačí snad obyčejné

select * from tabulka where id=1 order by poradi


V tomhle přece žádné záludnosti nejsou.
Tomiiiiiikk
Profil *
Kajman_

Mě už z toho dneska hrabe :-( Zase špatně, teď je to už dobře ;o)

ID, Poradi, Nazev, Popis
1, 1, Nějaké zboží, Nějaký popis
1, 2, , ,
1, 3, , ,
1, 4, Další zboží, Další popis
1, 5, , ,
1, 6, , ,
1, 7, , ,
2, 1, Další zboží2, Další popis2
2, 2, , ,
2, 3, , ,
2, 4, Další zboží, Další popis
2, 5, , ,
2, 6, , ,
2, 7, , ,
2, 8, Další zboží2, Další popis2


Potřebuji tedy selectovat podle ID, tudiz kdyz bude ID 2 nacte to

Další zboží2, Další popis2 a dalsi dva radky pod nim ...
Kajman_
Profil *
Tak to bude něco na způsob toho složitého, snažte se. Nebo si můžete vzít všechny a to filtrování udělat až v php.
Tomiiikkk
Profil *
Kajman_

Já zkouším, bohužel bez výsledku a jsem se v tom už zamotal, takže mi právě proto z toho hrabe :-( Tak budu přemýšlet zítra ráno až budu mít čistější hlavu ;o) Ale i tak díky za nastínění příkladu ...
Kajman_
Profil *
Na téhle struktuře by to mohlo být takto nějak
select k.*
from   tabulka k,
       (select min(t.poradi) maxlim, min(p.poradi) minlim
        from   tabulka t, (select min(poradi) poradi from tabulka where id = 2) p
        where  ifnull(t.nazev,'')!=''
               and t.id = 2
               and t.poradi > p.poradi) l
where  k.poradi >= l.minlim
       and k.poradi < ifnull(l.maxlim,k.poradi+1)
       and k.id = 2
order  by k.poradi
Tomiiikk
Profil *
Kajman_

Moc děkuji, zkusím¨, už jsem z toho zmatený jak lesní včelka ;o)
Tomiiikk
Profil *
Tak už jsme o krok vpředu ;o) Tak jsem to zkoušel, ale bohužel ještě nefunguje jedna věc.

Když zadám nějaké to ID. např. kde je vyplněný Nazev, aby tedy vylistoval ty záznamy, které jsou pod tímto a skončil vypsáním všech do té doby než nalezne další záznam kde je vyplněn Nazev.

Teď to vylistuje tak, že načte opravdu všechny záznamy se stejným ID, ale jen ty první v databázi. Ještě bych chtěl udělat to, že když je druhý řádek s vyplůněným názvem a má nějaké své ID které dám to proměné WHERE např. idradku aby od tohoto rádku vysypal zase dalsi radky nize. Ale jinak ten SELECT funguje perfektne, jeste jej rozlisit podle tech idradku napr. tak to bude uplne nejlepsi ;o)
Kajman_
Profil *
Tak se snažte, prostě si musíte zjistit odkud dokud to chcete. Klidně si to udělejte na tři dotazy, jestli s tím máte problémy. Bývá rychlejší se zamyslet a přijít si na řešení sám, než sepisovat milion různých zadání. A jen doufám, že jste zaměnil ono hledané id ve všech třech výskytech.
Tomiiik
Profil *
Kajman_

Teď mám čistší hlavu, tak to zkusím dneska nějak pořešit, pokud pomůže WHERE, bohužel jak jsem psal, umím v MySQL spíše jen normálně SELECTovat podle where apod. to vždy stačilo, teď je to něco jiného a blbě vymyšleného :-( Ale nedá se nic dělat, měl bych to tak udělat. Děkuju
Tomiiik
Profil *
Tak se mi podařilo řiřadit while pro toto selectování, již ve většině to běží. Bohužel pokud je poslední řádek při stejném ID vyplněný (tzn. je vyplněn Nazev), tak to tento řádek nevyselectuje. Selectuje jen ty řádky pod daným ID od začátku kde mají tedy vyplněn Nazev a jsou ty radky pod zaznamem prazdne. Bohuzel jak se vyselectuje poslední řádek kde je vyplněn Nazev, tak ho prostě do selectu nezahrne :-(

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: