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.

Tvůrce

Zobrazeno 18 zpráv z 18.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.