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

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

  •  
  •   king2014 · 2019-02-23 14:28:11 +08:00 · 3503 次点击
    这是一个创建于 2104 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现有一张表: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 条回复    2019-02-24 11:08:13 +08:00
    imaple
        1
    imaple  
       2019-02-23 15:45:55 +08:00
    语死早,看的很累。满足 1、2 条件很好写吧,条件 2 应该可以用正则,但是条件还是要输入,可以少写几个 OR LIKE。
    最后你都按 B groupby 了,怎么还能拿到所有 A 呢?
    sunnyadamm
        2
    sunnyadamm  
       2019-02-23 15:57:45 +08:00
    提供个思路,不出意外差不多就是这样了,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  
       2019-02-23 16:04:57 +08:00 via Android
    如果这个逻辑一定要放在 SQL 里的话
    条件 2 可以用 regexp 或者 fulltext search
    字段 A 可以用 group_concat
    xuanbg
        4
    xuanbg  
       2019-02-23 17:18:39 +08:00
    条件 1 可以做另一张表,用 join 即可,条件 2 用 sql 就没办法了简化了。。。不如读到集合中用代码循环迭代处理一次就好了。
    lihongjie0209
        5
    lihongjie0209  
       2019-02-23 17:33:10 +08:00
    条件 1 最简单, 只把满足条件 1 的找出来, 直接全部读到内存, 然后程序处理吧
    sunsh2017
        6
    sunsh2017  
       2019-02-23 18:36:33 +08:00
    #创建 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  
       2019-02-24 11:08:13 +08:00
    直接把那 300 个放到一张表里面,应该会好很多吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 21:22 · PVG 05:22 · LAX 13:22 · JFK 16:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.