现有一张表: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 放到字段里面去呢?
想请教各位,谢过各位了!
1
imaple 2019-02-23 15:45:55 +08:00
语死早,看的很累。满足 1、2 条件很好写吧,条件 2 应该可以用正则,但是条件还是要输入,可以少写几个 OR LIKE。
最后你都按 B groupby 了,怎么还能拿到所有 A 呢? |
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 |
3
kx5d62Jn1J9MjoXP 2019-02-23 16:04:57 +08:00 via Android
如果这个逻辑一定要放在 SQL 里的话
条件 2 可以用 regexp 或者 fulltext search 字段 A 可以用 group_concat |
4
xuanbg 2019-02-23 17:18:39 +08:00
条件 1 可以做另一张表,用 join 即可,条件 2 用 sql 就没办法了简化了。。。不如读到集合中用代码循环迭代处理一次就好了。
|
5
lihongjie0209 2019-02-23 17:33:10 +08:00
条件 1 最简单, 只把满足条件 1 的找出来, 直接全部读到内存, 然后程序处理吧
|
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) |
7
xidianzyf 2019-02-24 11:08:13 +08:00
直接把那 300 个放到一张表里面,应该会好很多吧
|