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

2019-02-23 14:28:11 +08:00
 king2014

现有一张表: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 放到字段里面去呢?
想请教各位,谢过各位了!

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/537927

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX