Do nového roku jako lepší programátoři? Znovu otevíráme večerní školu programování. Nette framework, návrhové vzory, testování nebo vůbec poprvé kurzy ASP.NET dostupné odkudkoli v republice.

Diskuze: Porovnávání více slov

PHP PHP Porovnávání více slov American English version English version

Avatar
Paranormal
Redaktor
Avatar
Paranormal:

Mám databázi kde je nějaká věc a tu věc popisuje třeba 10 klíčových slov. A já potřebuji nějak zjistit podle těch klíčových slov o jakou věc se jedná. Když už né přesně tak nejvíce pravděpodobně.

Díky :)

Odpovědět 19.5.2016 16:43
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Odpovídá na Paranormal
Martin Štěpánek (Enormyk):

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...? :-)

Nahoru Odpovědět 20.5.2016 19:42
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Paranormal:

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š?**:)

Nahoru Odpovědět 20.5.2016 21:06
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Martin Štěpánek (Enormyk):

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ě. :-)

Nahoru Odpovědět 20.5.2016 21:10
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Paranormal:

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? :)

Nahoru Odpovědět 20.5.2016 21:53
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Odpovídá na Paranormal
Martin Štěpánek (Enormyk):

Ano akorát budeš uchovávat jen Id koktejlu a věc se opakovat musí pokud ji chceš u více koktejlů. :-)

Nahoru Odpovědět  +1 21.5.2016 8:36
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Paranormal
Redaktor
Avatar
Paranormal:

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 :D

Nahoru Odpovědět  +1 21.5.2016 14:37
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Lukáš Hypša:

Já bych to udělal stejně :)

Nahoru Odpovědět  +1 22.5.2016 9:04
I když se programování učím jenom z interetu, velmi mě baví a doufám, že se tím jednou budu i živit.
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Paranormal:

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.

Editováno 22.5.2016 11:09
Nahoru Odpovědět 22.5.2016 11:09
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Vlado Cukalovsky:

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.

 
Nahoru Odpovědět 22.5.2016 11:54
Avatar
Tycek
Člen
Avatar
Tycek:

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.

 
Nahoru Odpovědět 22.5.2016 11:56
Avatar
Vlado Cukalovsky:

Á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.

 
Nahoru Odpovědět  +2 22.5.2016 12:00
Avatar
Vlado Cukalovsky:

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. :)

Editováno 22.5.2016 12:17
 
Nahoru Odpovědět  +1 22.5.2016 12:15
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na Vlado Cukalovsky
Paranormal:

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.

Nahoru Odpovědět 22.5.2016 12:21
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Vlado Cukalovsky:

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.

 
Nahoru Odpovědět 22.5.2016 12:31
Avatar
Vlado Cukalovsky:

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;
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +3 22.5.2016 12:42
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na Vlado Cukalovsky
Paranormal:

Jop, díky moc.. Vyzkouším to ;)

Nahoru Odpovědět 22.5.2016 12:51
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Odpovídá na Paranormal
Martin Štěpánek (Enormyk):

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í. :-)

Nahoru Odpovědět  +1 22.5.2016 16:12
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.