› 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
king2014
V2EX  ›  MySQL

有个需要,不知道这个 sql 怎么写比较合理?

  •  
  •   king2014 · Feb 23, 2019 · 4317 views
    This topic created in 2786 days ago, the information mentioned may be changed or developed.

    现有一张表:table_a
    表字段分别是:A|B|C
    想要从这张表得到符合如下条件的数据
    1.字段 B 必须是特定的几个(大概 50 各)比如说 B=‘ 1 ’或 B='2'....
    2.字段 C 必须是包含有特定词组(大概有 300 组)比如说 C 字段包含有‘ 1 ’或者‘ 2 ’...只要包含就算
    那么我如果想要获取符合条件的 B 字段进行分组得到 A 字段和 count(*)字段 sql 该如何编写?
    条件 1 可以使用 WHERE IN
    条件 2 用 LIKE %%
    但是条件 2 一定要写 LIKE %% OR LIKE....写 300 组吗?有无其他思路可以提供么?
    group by B 字段后 怎么把符合条件的所有 A 放到字段里面去呢?
    想请教各位,谢过各位了!

    7 replies  •  2019-02-24 11:08:13 +08:00
    imaple
        1
    imaple  
       Feb 23, 2019
    语死早,看的很累。满足 1、2 条件很好写吧,条件 2 应该可以用正则,但是条件还是要输入,可以少写几个 OR LIKE。
    最后你都按 B groupby 了,怎么还能拿到所有 A 呢?
    sunnyadamm
        2
    sunnyadamm  
       Feb 23, 2019
    提供个思路,不出意外差不多就是这样了,like 的 300 个值如果不同的话就老老实实写吧,或者可以结合程式去出结果,如果有规律可以像楼上说的正则
    select A,count(A) from (
    select * from table_a where b in ('1','2') and (c like '%%' or c like '%%' ...))
    group by A
    kx5d62Jn1J9MjoXP
        3
    kx5d62Jn1J9MjoXP  
       Feb 23, 2019 via Android
    如果这个逻辑一定要放在 SQL 里的话
    条件 2 可以用 regexp 或者 fulltext search
    字段 A 可以用 group_concat
    xuanbg
        4
    xuanbg  
       Feb 23, 2019
    条件 1 可以做另一张表,用 join 即可,条件 2 用 sql 就没办法了简化了。。。不如读到集合中用代码循环迭代处理一次就好了。
    lihongjie0209
        5
    lihongjie0209  
       Feb 23, 2019
    条件 1 最简单, 只把满足条件 1 的找出来, 直接全部读到内存, 然后程序处理吧
    sunsh2017
        6
    sunsh2017  
       Feb 23, 2019
    #创建 FUNCTION ,此函数用法如:select is_mixed('1001,1002,1003,1004', '1001,2001,3001,4001');
    DELIMITER $$;

    CREATE FUNCTION `is_mixed`(str1 TEXT, str2 TEXT) RETURNS TINYINT
    BEGIN
    DECLARE ismixed TINYINT DEFAULT 0;
    set ismixed:=(select concat(str1, ',') regexp concat(replace(str2,',',',|'), ','));
    RETURN ismixed;
    END;$$

    DELIMITER ;

    #执行 FUNCTION


    条件一,使用 find_in_set(needle, haystack),
    条件二,使用 is_mixed(field_c,specific_vocabulary_spit_by_commoa)
    xidianzyf
        7
    xidianzyf  
       Feb 24, 2019
    直接把那 300 个放到一张表里面,应该会好很多吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   990 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 20:07 · PVG 04:07 · LAX 13:07 · JFK 16:07
    ♥ Do have faith in what you're doing.