MySql去重--提取

sun488939 2010-09-02 05:40:43
先叙述问题:
有一张表data_user,里面存储的有用信息为mobile--手机号码,Level--用户等级
由于产品设计的特殊性,导致用户可以订购不同的业务,例如手机号码13800138000订购了付费会员,免费会员,短信笑话,彩信会刊等业务
现在要对订购了某一个业务的手机号码进行短信推广,但是用户订购业务过多,一个业务发送了,那么其他的业务就不能再发推广短信
例如:手机号码13800138000订购了付费会员,免费会员,短信笑话,彩信会刊业务,我现在要给付费会员中订购了彩信会刊业务的手机号码发送属于付费彩信会刊的彩信,这里要有13800138000这个手机号码;
我还要给免费会员中订购了彩信会刊业务的手机发送属于免费彩信会刊的彩信,这里就不能有13800138000这个手机号码了.按照上面的逻辑,我应该怎样操作?
我新建了一张表,data_user_tmp.然后select insert到新表了,然后就迷茫了...
...全文
724 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun488939 2010-09-03
  • 打赏
  • 举报
回复
嘿嘿,说实话没研究明白...不过还是感谢二位~~~
zuoxingyu 2010-09-02
  • 打赏
  • 举报
回复
狼头哥太牛了,SQL功底不是一般人能够达到的。

参照你前面的汇总表,得出结果。可以这么写

127.0.0.1~root@localhost~test>select * from (select mobile_no,group_concat(service_id) as service_id
-> from data_sms_tmp
-> group by mobile_no) a where FIND_IN_SET(1,service_id)>0 and FIND_IN_SET(4,service_id)>0 ;
+-------------+------------+
| mobile_no | service_id |
+-------------+------------+
| 18601121001 | 1,2,3,4 |
| 18601121003 | 4,3,2,1 |
| 18601121004 | 1,4 |
| 18601121006 | 1,2,4 |
| 18601121007 | 4,2,1 |
| 18601121010 | 1,2,3,4 |
| 18601121014 | 1,2,4 |
| 18601121015 | 4,1 |
+-------------+------------+
8 rows in set (0.00 sec)

127.0.0.1~root@localhost~test>



127.0.0.1~root@localhost~test>select * from (select mobile_no,group_concat(service_id) as service_id
-> from data_sms_tmp
-> group by mobile_no) a where FIND_IN_SET(2,service_id)>0 and FIND_IN_SET(4,service_id)>0
-> and FIND_IN_SET(1,service_id)=0;
+-------------+------------+
| mobile_no | service_id |
+-------------+------------+
| 18601121008 | 2,3,4 |
| 18601121009 | 4,2 |
| 18601121017 | 2,4 |
+-------------+------------+
3 rows in set (0.00 sec)


这样用子表的方式,肯定没狼头哥的好。但看起来比较直观,适合我这样的菜鸟。呵呵
ACMAIN_CHM 2010-09-02
  • 打赏
  • 举报
回复

我再给免费会员(订购关系为2)中订购了彩信会刊的用户(订购关系为2,4)发送免费彩信会刊,
18601121008 订购关系:2,3,4
18601121009 订购关系:2,4
18601121017 订购关系:2,4
mysql> select distinct a.mobile_no
-> from data_sms_tmp a,data_sms_tmp b
-> where a.mobile_no=b.mobile_no
-> and a.service_id=2
-> and b.service_id=4
-> and not exists (
-> select 1
-> from data_sms_tmp
-> where mobile_no=a.mobile_no and service_id=1
-> );
+-------------+
| mobile_no |
+-------------+
| 18601121008 |
| 18601121009 |
| 18601121017 |
+-------------+
3 rows in set (0.00 sec)

mysql>
ACMAIN_CHM 2010-09-02
  • 打赏
  • 举报
回复
我现在想给付费会员(订购关系为1)中订购了彩信会刊的用户(订购关系为1,4)发送高级彩信会刊
应该发送给下列用户:
18601121001 订购关系:1,2,3,4
18601121003 订购关系:1,2,3,4
18601121004 订购关系:1,4
18601121006 订购关系:1,2,4
18601121007 订购关系:1,2,4
18601121010 订购关系:1,2,3,4
18601121014 订购关系:1,2,4
18601121015 订购关系:1,4

mysql> select distinct a.mobile_no
-> from data_sms_tmp a,data_sms_tmp b
-> where a.mobile_no=b.mobile_no
-> and a.service_id=1
-> and b.service_id=4;
+-------------+
| mobile_no |
+-------------+
| 18601121001 |
| 18601121003 |
| 18601121004 |
| 18601121006 |
| 18601121007 |
| 18601121010 |
| 18601121014 |
| 18601121015 |
+-------------+
8 rows in set (0.11 sec)

mysql>
sun488939 2010-09-02
  • 打赏
  • 举报
回复
补充,用的是MySql
sun488939 2010-09-02
  • 打赏
  • 举报
回复
呃...给出create跟insert
CREATE TABLE `data_sms_tmp` (
`mobile_no` varchar(20) NOT NULL default 'NA',
`service_id` varchar(30) NOT NULL,
`prov` varchar(20) NOT NULL,
`city` varchar(20) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk

INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121001', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121001', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121001', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121001', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121002', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121002', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121003', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121003', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121003', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121003', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121004', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121004', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121005', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121005', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121005', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121006', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121006', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121006', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121007', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121007', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121007', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121008', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121008', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121008', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121009', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121009', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121010', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121010', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121010', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121010', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121011', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121011', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121012', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121013', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121014', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121014', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121014', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121015', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121015', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121016', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121016', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121017', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121017', '4', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121018', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121018', '3', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121019', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121019', '2', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121020', '1', '北京', '北京');
INSERT INTO `data_sms_tmp` (`mobile_no`, `service_id`, `prov`, `city`) VALUES ('18601121020', '3', '北京', '北京');


ACMAIN_CHM 2010-09-02
  • 打赏
  • 举报
回复
如果我现在想建表测试? 我的CREATE TABLE语句, INSERT INTO语句怎么写?

建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

sun488939 2010-09-02
  • 打赏
  • 举报
回复
哦哦,明白了,我先给出样本数据
表名:data_user
结构:
id,主键
mobile,手机号码,索引
service,会员服务类型,1付费会员,2免费会员,3免费笑话,4彩信会刊,索引
prov,省份(汉字名称)
city,城市(汉字名称)
手机号码:
18601121001 订购关系:1,2,3,4
18601121002 订购关系:1,3
18601121003 订购关系:1,2,3,4
18601121004 订购关系:1,4
18601121005 订购关系:1,2,3
18601121006 订购关系:1,2,4
18601121007 订购关系:1,2,4
18601121008 订购关系:2,3,4
18601121009 订购关系:2,4
18601121010 订购关系:1,2,3,4
18601121011 订购关系:2,3
18601121012 订购关系:1
18601121013 订购关系:2
18601121014 订购关系:1,2,4
18601121015 订购关系:1,4
18601121016 订购关系:1,3
18601121017 订购关系:2,4
18601121018 订购关系:2,3
18601121019 订购关系:1,2
18601121020 订购关系:1,3

以上数据是汇总的,转换为数据库内数据如下

18601121001 订购关系:1
18601121001 订购关系:2
18601121001 订购关系:3
18601121001 订购关系:4
18601121002 订购关系:3
18601121002 订购关系:3
18601121003 订购关系:1
18601121003 订购关系:2
18601121003 订购关系:3
18601121003 订购关系:4
18601121004 订购关系:1
18601121004 订购关系:4
18601121005 订购关系:1
18601121005 订购关系:2
18601121005 订购关系:3
18601121006 订购关系:1
18601121006 订购关系:2
18601121006 订购关系:4
18601121007 订购关系:1
18601121007 订购关系:2
18601121007 订购关系:4
18601121008 订购关系:2
18601121008 订购关系:3
18601121008 订购关系:4
18601121009 订购关系:2
18601121009 订购关系:4
18601121010 订购关系:1
18601121010 订购关系:2
18601121010 订购关系:3
18601121010 订购关系:4
18601121011 订购关系:2
18601121011 订购关系:3
18601121012 订购关系:1
18601121013 订购关系:2
18601121014 订购关系:1
18601121014 订购关系:2
18601121014 订购关系:4
18601121015 订购关系:1
18601121015 订购关系:4
18601121016 订购关系:1
18601121016 订购关系:3
18601121017 订购关系:2
18601121017 订购关系:4
18601121018 订购关系:2
18601121018 订购关系:3
18601121019 订购关系:1
18601121019 订购关系:2
18601121020 订购关系:1
18601121020 订购关系:3

假设情况:
我现在想给付费会员(订购关系为1)中订购了彩信会刊的用户(订购关系为1,4)发送高级彩信会刊
应该发送给下列用户:
18601121001 订购关系:1,2,3,4
18601121003 订购关系:1,2,3,4
18601121004 订购关系:1,4
18601121006 订购关系:1,2,4
18601121007 订购关系:1,2,4
18601121010 订购关系:1,2,3,4
18601121014 订购关系:1,2,4
18601121015 订购关系:1,4
我再给免费会员(订购关系为2)中订购了彩信会刊的用户(订购关系为2,4)发送免费彩信会刊,
18601121008 订购关系:2,3,4
18601121009 订购关系:2,4
18601121017 订购关系:2,4

我解释一下上面的例子,如果我要发送付费会员发送彩信会刊,那么我就会在数据库里取出订购关系为1与4的所有用户
然后在这些用户里面找出所有订购关系即为1又为4的用户,然后发送彩信
当我发送免费彩信会刊的时候,我就取出所有订购关系为2与4的手机号码,然后找出那些订购关系既有2又有4的用户发送彩信

我创建了一个临时表data_user_tmp,并且已经insert select完了,把我需要的数据都取了出来,现在纠结在不知道怎么按照我的需求去去重数据.

并且不一定拘泥与我已经创建的临时表,只要节省资源耗时短,两张三张都没关系.因为这些临时表在不发送的时候都是空的

不知道我这样的说明是否能看明白...
ACMAIN_CHM 2010-09-02
  • 打赏
  • 举报
回复
没看懂,建议举例说明。


建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

sun488939 2010-09-02
  • 打赏
  • 举报
回复
补充,这个问题以前一直都是在程序里面实现的,但是由于用户量已经达到百万,如果在程序里面实现对内存是个考验,并且还有其他的web程序跑在上面,故打算在MySql里面实现,不知道那种方法更加的节省资源并且满足我的需求??以前实现的方式是PHP

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧