先叙述问题:
有一张表data_user,里面存储的有用信息为mobile--手机号码,Level--用户等级
由于产品设计的特殊性,导致用户可以订购不同的业务,例如手机号码13800138000订购了付费会员,免费会员,短信笑话,彩信会刊等业务
现在要对订购了某一个业务的手机号码进行短信推广,但是用户订购业务过多,一个业务发送了,那么其他的业务就不能再发推广短信
例如:手机号码13800138000订购了付费会员,免费会员,短信笑话,彩信会刊业务,我现在要给付费会员中订购了彩信会刊业务的手机号码发送属于付费彩信会刊的彩信,这里要有13800138000这个手机号码;
我还要给免费会员中订购了彩信会刊业务的手机发送属于免费彩信会刊的彩信,这里就不能有13800138000这个手机号码了.按照上面的逻辑,我应该怎样操作?
我新建了一张表,data_user_tmp.然后select insert到新表了,然后就迷茫了...

解决方案 »

  1.   

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

  2.   

    没看懂,建议举例说明。
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式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)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  3.   

    哦哦,明白了,我先给出样本数据
    表名: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完了,把我需要的数据都取了出来,现在纠结在不知道怎么按照我的需求去去重数据.并且不一定拘泥与我已经创建的临时表,只要节省资源耗时短,两张三张都没关系.因为这些临时表在不发送的时候都是空的不知道我这样的说明是否能看明白...
      

  4.   

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

  5.   

    呃...给出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=gbkINSERT 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', '北京', '北京');
      

  6.   

    我现在想给付费会员(订购关系为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,4mysql> 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>
      

  7.   


    我再给免费会员(订购关系为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>
      

  8.   

    狼头哥太牛了,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)
    这样用子表的方式,肯定没狼头哥的好。但看起来比较直观,适合我这样的菜鸟。呵呵