【问题标题】:MySQL using like expression in referenced tableMySQL 在引用表中使用类似表达式
【发布时间】:2015-03-03 09:01:09
【问题描述】:

这是关于在数据库中搜索关键字,精确地在表 users 中搜索,同时在排名/分数方面对用户的姓名和电子邮件地址进行不同的加权。
这不应该是关于全文搜索,所以这是我的方法:

我想在整个数据库中搜索关键字“john”,它也应该返回 john,例如'johna',加上姓名的权重应高于电子邮件地址:

select u.id,u.name,((u.name LIKE '%john%')*5 + (u.mail LIKE '%john%')*3) as score
from users u
having score > 0
order by score desc

想象有一张桌子user_has_kittens

user_id  kitten_id
------------------
1        1
1        2
1        3
1        4
2        3
2        42

您已经看到此表的用途:它定义了哪个用户拥有哪只小猫,当然您可以拥有任意数量的小猫。

此外,小猫的名字在kittens 和列id,name 中都有名字

如何同时搜索小猫的名字并对其进行加权:关键字在小猫的名字中,然后给这个用户一个加1的分数。

select [...] + SUM [ ( u's kitten's name like %john% )*1] ) as score

例如澄清:

username, email,            (his/her kittens);   score
john,     john@example.org, (johna, myjohn);     5+3+1+1 (user matches, mail matches, two kittens match)
linda,    linda@john.org,   (myjohn);            0+3+1   (user doesn't match, mail matches, one kitten matches)

顺便说一句。在教义中使用它是目的,但是简单的原生 MySql 也非常足够。

【问题讨论】:

    标签: mysql database doctrine-orm many-to-many foreign-key-relationship


    【解决方案1】:

    我不知道您的实际要求是什么。但我想我可以把你引向右边..

    select u.id,u.name,( if(u.name LIKE '%john%', 5, 0) + if(u.mail LIKE '%john%', 3, 0)) as score
    

    试试这个

    【讨论】:

    • 这已经有效,请阅读整个问题。这也是关于在引用表kitten 中搜索字符串john
    • 结构与 m2m 关系一样简单,因此它是表 usersid,name 和小猫与 id,name 问题中提到.引用表称为user_has_kittens。我想,查询中必须有一些堆叠或嵌套的SELECT,因此每个用户都会遍历所有小猫。也许…… Group_CONCAT
    • @croma 好的,检查一下sqlfidle..希望这会对你有所帮助
    • 谢谢 - 很好但并不完美,因为当一些用户没有小猫时,即使他的用户名与关键字匹配,他也不会显示 - 尝试删除 value (2, 1) @ line 34, user ' btest' 在他的用户名中有 'test' 但未显示。顺便提一句。我知道也存在LEFT JOIN 并连接引用值的解决方案 - 这里:小猫 - 逗号分隔,然后检查这个聚合值,c.f. stackoverflow.com/questions/2400498/…(顺便说一句,那里的问题已经有了可行的解决方案)虽然我更喜欢采用这种方法
    • @croma。是的,我错过了那种情况。感谢您记住我。实际上,解决方案是完美的方式很重要。希望您能找到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2016-05-30
    • 2012-06-24
    • 2018-06-17
    • 2020-07-08
    • 1970-01-01
    • 2012-12-14
    相关资源
    最近更新 更多