› 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 · Jan 9, 2021 · 4584 views
    This topic created in 2090 days ago, the information mentioned may be changed or developed.
    假设有表
    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 replies  •  2021-01-09 23:31:02 +08:00
    test3207
        1
    test3207  
       Jan 9, 2021 via Android   ❤️ 1
    不要在数据库里搞搜索好些……虽然有些数据库有类似分词插件的邪道玩法,但是搞搜索 es 才是正统啊
    dfzj
        2
    dfzj  
       Jan 9, 2021   ❤️ 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  
       Jan 9, 2021   ❤️ 1
    一楼说的对呀,怎么写都感觉邪门歪道,如果条件所限,只能笨办法来了
    yodhcn
        4
    yodhcn  
    OP
       Jan 9, 2021
    @dfzj #2 确实我也很疑惑,"ccc like %keywork_A%" 用不到索引,用 SQL 搜索关键字是不是只能逐行比对?
    在我的使用场景中,数据库中至多有 1 万 行数据,请问这种情况下,用 SQL 搜索关键字是否可行?
    sunsijia
        5
    sunsijia  
       Jan 9, 2021
    一楼说的对,搞个搜索吧
    dfzj
        6
    dfzj  
       Jan 9, 2021   ❤️ 1
    @yodhcn 如果至多一万行的话,那不用在意什么执行效率了,可以尝试
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2536 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:14 · PVG 20:14 · LAX 05:14 · JFK 08:14
    ♥ Do have faith in what you're doing.