Diskuze: Porovnávání více slov
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 18 zpráv z 18.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Můžeš prosím trochu více rozvést svoji myšlenku?
Myslíš jako, že někdo zadá
slovo auto a ono ti to z databáze vytáhne Škoda atd...? 
Nn, třeba koktejl.
Uživatel si vybere klíčová slova "banán, mléko, cukr" na první pozici
bude Banánový koktejl který obsahuje všechny slova. Na dalších místech
budou další koktejly, protože je tam mléko..
Chápeš?**:)
Vytvoř si 2 tabulky, koktejly a slova. V 1. bude id_koktejlu a nazev. Dále
2. tabulka bude obsahovat id_slova, id_koktejlu (ke kterému patří) a
slovo.
Díky tomu bude moci mít jeden koktejl více slov. Poté už jen hledej v
databázi slov slova použitím například LIKE a vypiš si podle id_koktejlu
koktejly v první tabulce.
Snad jsem to napsal srozumitelně. 
A to budu muset psát například ze koktejl
Banánový- mleko
Borůvkovy-mleko
Jahodový - mléko
Atp? To se bude hodně opakovat ne? 
Ano akorát budeš uchovávat jen Id koktejlu a věc se opakovat musí pokud
ji chceš u více koktejlů. 
A nešlo by to udělat spíš nějak jako:
| id_kokteilu | jmeno_kokteilu | ingredience1 | ingredience2 | ingredience3 |
| 1 | Banánový | mléko | banány | cukr |
| 2 | Borůvkový | mléko | borůvky | šlehačka |
| 3 | Jahodový | mléko | jahody | cukr |
Potom bych třeba do vyhledávání zadal
$keywords = "mléko, cukr";
A vypsalo by mi to všechny 3 kokteily, protože všechny obsahují mléko.. Ale kokteil 1 a 3 by byl nad 3 protože ty obsahují ještě cukr a 2 neobsahuje cukr..
Tak nějak bych si to představoval 
Já bych to udělal stejně 
Jediné co mě napadá je to udělat pomocí cyklů.. Že bych v PHP udělal
cyklus, který by šel sestupně.
3,2,1 a v každé by hledal schodu.
.
3 by hledal schodu ve 3 ingrediencích
2 ve dvou
a v jedné ingredienci
a pak by se to takhle postupně vypsalo.. Ale nevím jestli by to nebylo moc náročné na rychlost.
No najlepšie by bolo ako už bolo vyššie spominané, že budeš mať jednu tabuľku s koktejlami, druhu tabuľku s ingrediencami a kedže je to vzať many to many N:M, tak si vytvoriš tretiu tabuľku aby si tuto vazbu rozbil a ta bude obsahovať id_koktejl a id_ingrediencie. Potom si to už vieš pekne podľa tejto tabuľky selectnuť podľa určenej ingrediencie.
Mně třeba ještě napadlo jiné řešení.
Co kdybys měl tabulku se sloupci id_koktejlu, nazev_koktejlu a ingredience.
Ve sloupci ingredience bys měl string s 10 klíčovými slovy oddělených
třeba čárkou.
Pak by sis pro každý koktejl načetl celý string, rozsekal by sis ho na pole
stringů a pak akorát porovnával se zadanými klíčovými slovy a podle
počtů shod bys je pak seřadil.
Áno, ale takto by si mi pri každom hľadaní musel vybrať každý jeden
koktejl z databázy rozbiť ten string, porovnať to a niekde ukladat priebežny
výsledok.
Ak maš tabuľky ako som vysvetlovaľ o príspevok vyššie, tak vieš
vytiahnuť presne koktejl ktorý obsahuje danú/é ingrediencie a takisto aj ich
počet výskutu v tom koktejli.
Pridávam aj príklad selectu, ktorý vráti koktejl a počet výskytov
zadaných ingrediencií.
Tabuľka koktejl_ingt
| koktejl | ingt |
| bananovy | banan |
| bananovy | mlieko |
| jahodovy | mlieko |
| jahodovy | jahoda |
Query:
SELECT koktejl,COUNT(koktejl) as pocet
FROM koktejl_ingt
WHERE ingt IN ("banan","mlieko")
GROUP BY koktejl
ORDER BY pocet DESC;
| koktejl | pocet |
| bananovy | 2 |
| jahodovy | 1 |
V realnej appke, to len prerobiš na tri tabuľky koktejl, ingrediencie a túto tabuľku kde konkretné hodnoty nahradiš IDčkami na tabuľky koktejl a ingrediencie.
Snaď som pomohol. 
Jasný, chápu
Super, jen
jsem myslel že tohle bude dost zatěžovat databázi, když tam bude třeba
1000 koktejlů.. Ale dobře, je to pěkný 
Jen ještě abych to úplně pochopil můžeš mi to tu napsat úplně celý?
jakože i fungující? Nebo přes soubor abych viděl i funkčnost. Z tohohle
sem pochopil princip, ale nevím jak to napojit i na uživatelský script atp.

Díky.
No treba uvažovať vždy to, že práca s databázou je oveľa rychlejšia
ako riešiť rovnaký problém aplikačne. V tomto prípade ak vieš že každý
koktejl nemá rovnaký počet ingrediencií, tak je podľa mňa určite toto
najlepšia voľba.
No ak to chceš implementovať na tie tri tabuľky, tak jedine do podmienky
WHERE ingt IN, vložiš subselect do tabuľky pre ingredience, kde vytiahneš
tie ingrediencie, ktoré ti boli zadané uživateľom, a pre vytiahnutie
koktejlov spraviš inner join na tabuľky koktejl a potom by ti to malo vypluť
rovnaký výstup.
Tabuľka koktejl
id, názov
Tabuľka ingrediencie
id, názov
Tabuľka koktejl_ingt
id_koktejl , id_ingt
SELECT k.nazov, COUNT(ki.id_koktejl) as pocet
FROM koktejl_ingt ki
INNER JOIN koktejl k ON k.id = ki.id_koktejl
WHERE ki.id_ingt IN (
SELECT id
FROM ingrediencie
WHERE názov IN ("banan","mlieko") // proste vlozis tu tvoje pole vybranych ingrediencii
)
GROUP BY ki.id_koktejl
ORDER BY pocet DESC;
Mimochodem určitě by to takhle šlo, ale kdyby jsi k nějakému koktejlu
chtěl přiřadit více jak 3 ingredience, byl bys v háji 
Tahle můžeš uchovávat ke každému koktejlu kolik chceš ingrediencí. 
Zobrazeno 18 zpráv z 18.
