SQL: Jak porovnat text s odlišnou délkou? – MS SQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

SQL: Jak porovnat text s odlišnou délkou? – MS SQL – Fórum – Programujte.comSQL: Jak porovnat text s odlišnou délkou? – MS SQL – Fórum – Programujte.com

 

oxidián0
Grafoman
17. 2. 2020   #1
-
0
-

Struktura tabulky:

id  = INT

date = INT UNSIGNED

subject = TEXT

desc = TEXT

text = TEXT

Data v tabulce:

1, dnešní datum a čas, 'Nový článek', 'Test test test', 'Dostal jsem hlad, tak jsem si koupil housky.'

2, dnešní datum a čas, 'Nový článek', 'Test test', 'Dostal jsem hlad, tak jsem šel nakoupit housky.'

Data k odeslání:

dnešní datum a čas, 'Nový článek', 'Test', 'Dostal jsem hlad.'

Dotaz:

Můžete mi poradit jak napsat SQL příkaz pro mysql (v.5) když chci zjistit, jestli v db již neexistuje příspěvek s podobným textem? Podmínky zní:

  1. Nadpis nesmí být podobný
  2. Předmět nesmí být podobný
  3. Článek nesmí začínat na stejný text

Dejme tomu, že oba texty oříznu o 16 znaků a porovnám. Vím, že oříznutí se dělá pomocí LEFT(16) a porovnávací string si oříznu v php. Takže bych to porovnal s textem: 'Dostal jsem hlad'.

Ideální by bylo udělat výběr takový, aby hledal články dnešní, max. 10 příspěvků.

Nahlásit jako SPAM
IP: 89.176.180.–
gna
~ Anonymní uživatel
1891 příspěvků
17. 2. 2020   #2
-
0
-

Pokud jde o wildcard, tak můžeš použít LIKE, pokud chceš něco inteligentnějšího tak MATCH-AGAINST. Nebo samozřejmě můžeš použít vlastní funkci, existuje dost algoritmů, které i lempl jako ty zvládne implementovat.

Nahlásit jako SPAM
IP: 213.211.51.–
MilanL+1
Grafoman
18. 2. 2020   #3
-
0
-

Tedy tohle není jednoduché udělat ani programově natož přímo pomocí SQL, důležité tam je to "nesmí být podobný", jde o úroveň podobnosti, to je skoro na AI.

jeden příklad za všechny stačí přehodit slovosled, např:

Excel práce s DATETIME

Jak použít DATETIME v Excelu

texty nejsou stejné, úroveň podobnosti je cca 40%, významová shoda je kolem 90%

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
18. 2. 2020   #4
-
0
-

Milan,

Já už to mám v podstatě implementované, jen bych tam ještě potřeboval dostat to porovnání datumů. Tedy když mám dnešní datum a datum v databázi a chci zjistit jak velký je rozdíl, že tento rozdíl nesmí být větší než 86400.

    $articleMaxLen = 21;
    /* CHECK WHETHER THE SUBJECT OR POST DOES NOT EXIST IN SAME FORUM */
  	$query = array(
  		'SELECT'	=> 't.poster, t.posted, t.article',
  		'FROM'		=> 'topics AS t',
		  'ORDER BY'	=> 't.posted DESC',
		  'LIMIT'		=> 10,
  		'WHERE'		=> "(t.forum_id=$fid AND t.subject='$subject') OR ( t.forum_id=$fid AND t.subject='$subject') OR left( t.article, $articleMaxLen)='".substr($article,0,$articleMaxLen)."'"
  	); // SUBSTRING(t.article, 0, $articleMaxLen) pro php 5.6>?
     
    $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);

to datum je int(10) unsigned.

Můj pokus, ale nefunguje:

Nahlásit jako SPAM
IP: 89.176.180.–
oxidián0
Grafoman
18. 2. 2020   #5
-
0
-

Tak jsem to už definitivně vyřešil.

Nahlásit jako SPAM
IP: 89.176.180.–
Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
4016 příspěvků
19. 2. 2020   #7
-
0
-

Jestli to budes delat hodne casto, tak bys musel prejit na fulltext vyhledavani.
Take je mozne vytvorit si pomocny sloupec a ulozit do nej prvnich 16 znaku. Pak muzes porovnavat rozvnitkem. Index tomu sloupci bych nastavil na prvni 2-3 znaky. (nebo, jestli to jde, tak pouzit 16 znakovy index)

Nahlásit jako SPAM
IP: 2001:718:2601:258:dd04:9182:5c7:c5c...–
peter
~ Anonymní uživatel
4016 příspěvků
19. 2. 2020   #8
-
0
-

Jo, jeste mne napada, ze bys mohl pridat k clankum kategorie, stitky. Jakoze clanek je na tema doprava nebo priroda, … Dalsi moznost overeni pak bys mel, kolik stitku splnuje. Podobne clanky maji podobne stitky, pokud je autori vyklikaji :)

Nahlásit jako SPAM
IP: 2001:718:2601:258:dd04:9182:5c7:c5c...–
oxidián0
Grafoman
19. 2. 2020   #9
-
0
-

Předělal jsem jednu veřejně dostupnou aplikaci, která pracuje s forem, akordá místo prvního příspěvku v diskusi jsem dal článek. Pod články je diskuse. Nějaké tagy k tématům tam jsou, ale zatím jsem to nezačal používat.  Takže datový typ pro čas/datum jsem nechal tak jak to maj udělané, abych neměl moc práce s předěláváním.

Nahlásit jako SPAM
IP: 89.176.180.–
ondrej39+1
Věrný člen
3. 3. 2020   #10
-
0
-

#9 oxidián
Na takové porovnání textových řetězců, které potřebuješ, je lepší použít porovnání na úrovni trigramů pro konkrétní databázi. Např. v PostgreSQL se k tomu využívá pg_trgm extension, v MS SQL můžeš využít funkci DIFFERENCE.

I porovnání na LIKE má totiž velmi velký problém. Pokud budeš mít řetězce které se liší jen v překlepu, např.:

  • a: měl jsem chleba s máslem
  • b: měl jsem chlebo s máslem

pak porovnání:

WHERE (a LIKE '%' + b + '%' OR b LIKE '%' + a + '%')

vrátí FALSE, byť se jedná o prakticky identické texty s jedním drobným překlepem.

Nahlásit jako SPAM
IP: 195.39.55.–
Inject all the dependencies!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý