V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
yodhcn
V2EX  ›  MySQL

请教一个 SQL 按关键词查询的问题

  •  
  •   yodhcn ·
    yodhcn · 2021-01-09 17:16:21 +08:00 · 3259 次点击
    这是一个创建于 1399 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假设有表
    t_user
    id column_1 column_2 column_3

    t_tag
    id name

    r_user_tag
    tag_id user_id

    前端传来一组关键字 "keyword_A keyword_B|keyword_C -keyword_D"
    要求查询包含 "keyword_A" 且 包含 "keyword_B"或"keyword_C" 且不包含 "keyword_D" 的 user 的结果

    注:关键字 keyword 可能出现在 column_1,column_2,column_3,t_tag.name



    像这种情景,该如何编写 SQL 查询语句?

    是不是应该在 t_user 新增一个 search 列,在插入数据时,先将关键词提前拼接好存到 search 里,再在查询时根据 search 查找关键词,这样做更好些?
    6 条回复    2021-01-09 23:31:02 +08:00
    test3207
        1
    test3207  
       2021-01-09 17:41:44 +08:00 via Android   ❤️ 1
    不要在数据库里搞搜索好些……虽然有些数据库有类似分词插件的邪道玩法,但是搞搜索 es 才是正统啊
    dfzj
        2
    dfzj  
       2021-01-09 17:43:25 +08:00   ❤️ 1
    如果不考虑执行效率,只考虑开发效率,可以这样干:构造一张新表,把字段拼接起来,
    然后用新造字段去匹配条件:
    SELECT * FROM
    (SELECT concat(column_1, column_2, column_3, t_tag) as ccc,
    ...
    FROM t_user left join t_tag) as A
    WHERE ccc like keyword_A and ccc like keyword_B and ccc like keyword_C
    AND ccc not like keyword_D

    显然上述方法没办法走索引。
    另外现在直接写 SQL 就可以快速开发系统了: wuyuan.io
    w504391883
        3
    w504391883  
       2021-01-09 17:43:35 +08:00   ❤️ 1
    一楼说的对呀,怎么写都感觉邪门歪道,如果条件所限,只能笨办法来了
    yodhcn
        4
    yodhcn  
    OP
       2021-01-09 19:06:50 +08:00
    @dfzj #2 确实我也很疑惑,"ccc like %keywork_A%" 用不到索引,用 SQL 搜索关键字是不是只能逐行比对?
    在我的使用场景中,数据库中至多有 1 万 行数据,请问这种情况下,用 SQL 搜索关键字是否可行?
    sunsijia
        5
    sunsijia  
       2021-01-09 19:17:35 +08:00
    一楼说的对,搞个搜索吧
    dfzj
        6
    dfzj  
       2021-01-09 23:31:02 +08:00   ❤️ 1
    @yodhcn 如果至多一万行的话,那不用在意什么执行效率了,可以尝试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2801 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.