Autor Zpráva
Jardaklon
Profil *
Hezký den,
dumám nad tím jak to napsat, aby se mi vypsly z databáze z několika sloupců (kde je hodnota buď 0 nebo 1) hodnoty jedna (čili nenulové) které jsou schodné s hodnotami řádku uživatele x.

V praxi má dojít k tomu, aby se konkrétnímu přihlášenému uživateli vypsaly hodnoty shodné s jeho nastavením a s hodnotami ostatních uživatelů. Takže mám třeba dva sloupce: sobota a neděle a mám dva užiavtele Honza a Anička. Uživatele si maj možnost vybrat kdy maj čas, když daj že maj čas v sobotu, tak se v sloupku sobota zapíše hodnota 1. A já chci aby se třeba Aničce zobrazilo že ve shodný den má čas i Honza.
Jde tedy o hledání shody.

Budu vděčný za rady.
Sir Tom
Profil
Jardaklon:
Také hezký den,

tipoval bych, že se jedná o špatný návrh db? (Nestačilo by do sloupce den zapsat třeba pouze název dne?)

Nicméně tvůj problém bych řešil takto - vytáhnu si řádek Aničky a do proměnné (asi to bude pole) si uložím její hodnoty (jedničky a nuly). Poté sestavím sql příkaz, který bude vyhledávat řádky kde (za pomoci WHERE a AND) budou stejné hodnoty jako v poli.

Např.
Osoba | Dítě | Matematik | Fyzik
-----------------------------------------
Lenka | 0 | 1 | 0 -> vytáhnu tento řádek a do pole si uložím hodnoty: pole = array(0, 1, 0);
Elenka | 1 | 1 | 0
Helenka| 0 | 1 | 0

následuje sql dotaz: ....... WHERE Dítě = pole[0] AND Matematik = pole[1] AND Fyzik = pole[2]
Kajman
Profil
Sir Tom:
V dotazu by mělo být spíše or - asi hledá alespoň jeden stejný den.

Jardaklon:
Také bych ukládat příznaky jinak...
id_uzivatele, datum, hodnota(0,1)

Pak by byl dotaz ještě o chlup jednodušší.
Sir Tom
Profil
Kajman:
V dotazu by mělo být spíše or - asi hledá alespoň jeden stejný den.
Záleží jestli hledá naprosto stejný řádek, nebo řádek s alespoň jednou společnou položkou. Z dotazu to není poznat.
Jardaklon
Profil *
Sir Tom:
Je to tak že mám dny v týdnu jako sloupce tabulky a v každém mám 0 nebo 1. Chci aby se mi vypsala schoda třeba že má uživatel čas ve shodný den. Tzn, alespoň jedna shoda třeba pro pondělí by měla vyhodit hlášku: uživatel Honza má v pondělí také volno. Nebo tak něco.
Keeehi
Profil
A co tabulka o dvou sloupcích. První id_uživatele, druhý den. id_uživatele je snad jasné, v den bude číslo 1-7, pokud má ten uživatel v ten den čas. Takže záznam pro Honzu (id=300) který má volno ve ST, SO, NE by vypadal takto:
id_uzivatele | den
300          | 3
300          | 6
300          | 7

A dotaz by pak mohl vypadat nějak takto:
SELECT * FROM tabulka WHERE den IN (SELECT den FROM tabulka WHERE id_uzivatele = 300) ORDER BY id_uzivatele
případně by ta tabulka šla sjoinovat sama se sebou. S tím ale nemám moc zkušeností, takže tu nechci psát bláboly. Kajman by však určitě poradil.
Jardaklon
Profil *
Keeehi:
Děkuji Ti. Jsem si vědom toho že návrh databáze jsem neudělal úplně správně, jsem začátečník. Až budu dělat příště podobnou, tak využiju tvé rady, ale teď už tam mám většinu napsanou s tím že počítám že každý den je samostatný sloupec. Tak právě potřebuji poradit to hledání shodnosti v řádku s ostatními.
Keeehi
Profil
Jardaklon:
potřebuji poradit to hledání shodnosti v řádku s ostatními.
To už ti radili Sir Tom a Kajman v [#2] a [#3]. Jen se jim tam ty sloupce jmenují jinak, ale o to přece nejde.
Kajman
Profil
Případně jedním dotazem, nějak takto...

select cil.uzivatel,
       (vzor.pondeli & cil.pondeli) po,
       (vzor.utery   & cil.utery)   ut,
       (vzor.streda  & cil.streda)  st
from   tabulka as vzor
join   tabulka as cil
on     vzor.uzivatel != cil.uzivatel
       and ((vzor.pondeli & cil.pondeli) or
            (vzor.utery   & cil.utery)   or
            (vzor.streda  & cil.streda)
            )
where  vzor.uzivatel = 'Anička'

Ale s rozumným návrhem tabulky by to bylo opravdu o dost jednodušší.
Jardaklon
Profil *
Kajman:
Děkuji moc.

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: