Autor | Zpráva | ||
---|---|---|---|
matak Profil |
#1 · Zasláno: 29. 6. 2008, 16:46:10
Napadá někoho řešení jak vypočítat na -!-úrovni mysql-!- množství shodných podmínek zadaných pomocí OR?
např. SELECT procentoshody, name, date, key FROM names WHERE key LIKE '%abc%' OR key LIKE '%def%' OR key LIKE '%ghi%'; a tedy i řadit výsledek podle procenta shody? pokud key splňuje všechny podmínky má rank 3/3 takže 100%, pokud splňuje jen 2 podmínky má rank 2/3 apod. díky za tipy |
||
ninja Profil |
#2 · Zasláno: 29. 6. 2008, 16:51:51
podminky dat do nekolika vnorenych IFu a seradit vysledky podle nich.
|
||
Joker Profil |
#3 · Zasláno: 29. 6. 2008, 17:03:20
Nešlo by použít fulltextové vyhledávání (MATCH ... AGAINST), které rovnou řadí výsledky podle relevance?
|
||
matak Profil |
#4 · Zasláno: 29. 6. 2008, 20:24:52
ty IF jsou zatím jediné řešení co mne napadá, vzhledem k tomu, že tam má být třeba 20 podmínek, moc se mi do těch IFu nechce, přece jen je to porovnání 20x IF na každém záznamu ve výsledku, tak nějak mám pocit, že to bude strašně pomalé
s tím fulltextem nemám šanci běží to na innoDB |
||
ninja Profil |
#5 · Zasláno: 29. 6. 2008, 22:46:03
matak: tak si navrhni jinou strukturu databaze. Ono to tobude obecne mnohem rychlejsi, kdyz misto nad 20 sloupci spustis prikaz LIKE jen nad jednim.
|
||
Kajman_ Profil * |
#6 · Zasláno: 1. 7. 2008, 14:09:47
select id, sum(rank) from
(select id, 1 rank FROM names WHERE `key` LIKE '%abc%' union all select id, 1 rank FROM names WHERE `key` LIKE '%def%' union all select id, 1 rank FROM names WHERE `key` LIKE '%ghi%' ) tmp group by id order by 2 |
||
matak Profil |
#7 · Zasláno: 1. 7. 2008, 14:55:28
co znamená ? 1 rank ?
a to bude rychlejší než ten IF? nebo lepší? přece jen pro dvacet porovnání je 20x poddotaz? a ještě jejich spojení? moje řešení? je v něčem výhodnější to množství poddotazů? SELECT (IF(key LIKE '%abc%', 1, 0)+IF(key LIKE '%abc%', 1, 0)+IF(key LIKE '%abc%', 1, 0)) rank FROM names WHERE key LIKE '%abc%' OR key LIKE '%def%' OR key LIKE '%ghi%'; |
||
Kajman_ Profil * |
#8 · Zasláno: 1. 7. 2008, 15:00:43
co znamená ? 1 rank ?
číslo 1 ve sloupci pojmenovaném rank a to bude rychlejší než ten IF? Zkuste si to změřit, nevím, co je rychlejší. Ale když máte or, tak si to db většinou stejně přepíše do unionu. |
||
matak Profil |
#9 · Zasláno: 1. 7. 2008, 15:34:32
zkusím jak je to s rychlostí,
ale sory asi sem natvrdlej ale číslo 1 ve sloupci pojmenovaném rank? ?? sloupec pojmenovaný rank, ano chápu, ale co to číslo jedna nejaký kontext by nebyl? ale jinak díky |
||
Kajman_ Profil * |
#10 · Zasláno: 1. 7. 2008, 15:43:02
Když sečtete ty jedničky, máte počet vyhovujících podmínek. Jen tam má být v řazení desc. Šlo by použít i count(*), ale když někdy budete chtít nějaké podmínce dát větší váhu, tak tam můžete dát i jiné číslo než 1.
|
||
Časová prodleva: 16 let
|
0