有个库结构:
CREATE TABLE `hanzhiku` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `sj` binary(20) NOT NULL,
  PRIMARY KEY (`id`,`sj`)
) ENGINE=InnoDB AUTO_INCREMENT=22304 DEFAULT CHARSET=gbk;
我希望实现的查询是:
提供一个20比特的二进制数据,查询与这个二进制数最接近的数据
具体算法:把两个二进制数进行异或操作,得到的数值中1的数量最小.

解决方案 »

  1.   

    转化成整数select max(id) from tb where id<整数
    union all
    select min(id) from tb where id>整数
      

  2.   

    我要查询的是二进制的数据,不是ID
    ID是键值,自动增加的
      

  3.   

     (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式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)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  4.   

    不好意思,可能表达不清楚
    首先库结构是:
    只有2个字段,
    一个字段名称为:`id` int(10) unsigned NOT NULL AUTO_INCREMENT
    还有一个字段是二进制类型:`sj` binary(20) NOT NULL,
    接下来是版本,用的是,最新版的MYSQL
    比例数据库中有如下数据:
     ('1','01111010101000000');
     ('2','00001011111000101');题目出来了
    已知a=00011011111000001
    求一个SQl语句,查询库中和a最接近的数据
    算法如下:
    先把a和字段'sj'异或运算
    如下:
    第一个记录:
    01111010101000000
    00011011111000001
    结果1
    01100001010000001
    第二个记录:
    00001011111000101
    00011011111000001
    结果2
    00010000000000100
    找出结果中.位为1最少的情况
    这里的答案就是结果2,
    然后返回,这个记录的ID
      

  5.   

    /*
    Navicat MySQL Data TransferSource Server         : 11
    Source Server Version : 50513
    Source Host           : 192.168.2.88:3306
    Source Database       : asktaoTarget Server Type    : MYSQL
    Target Server Version : 50513
    File Encoding         : 65001Date: 2011-07-07 08:51:58
    */SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
    -- Table structure for `hanzhiku`
    -- ----------------------------
    DROP TABLE IF EXISTS `hanzhiku`;
    CREATE TABLE `hanzhiku` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `zk` binary(28) NOT NULL,
      PRIMARY KEY (`id`,`zk`)
    ) ENGINE=InnoDB AUTO_INCREMENT=22304 DEFAULT CHARSET=gbk;-- ----------------------------
    -- Records of hanzhiku
    -- ----------------------------
    INSERT INTO `hanzhiku` VALUES ('1',  0xFFF808000800080010001FE000200020002000200040064001800000);
    INSERT INTO `hanzhiku` VALUES ('2', 0x020002000200020002000200020002000200020002000200FFF80000);
    INSERT INTO `hanzhiku` VALUES ('3', 0xFFF80200020002000200020002000200020002000200020002000000);
    INSERT INTO `hanzhiku` VALUES ('4', 0x0010FFF80400040004000800080010002000C0000000000000000000);
    INSERT INTO `hanzhiku` VALUES ('5', 0xFFF802000200220023F0221042107FF0001000100020022001C00000);
    INSERT INTO `hanzhiku` VALUES ('6', 0x7FF00210021012100C100610051008101010212040C00000FFF80000);
    INSERT INTO `hanzhiku` VALUES ('7', 0x02002220222022202220FFF82220222022202220222022203FE00000);
    INSERT INTO `hanzhiku` VALUES ('8', 0x7FF0020002003FF002000200FFF8040004000840082011F03E100000);
      

  6.   

    mysql> select id,hex(zk) from hanzhiku;
    +----+----------------------------------------------------------+
    | id | hex(zk)                                                  |
    +----+----------------------------------------------------------+
    |  1 | FFF808000800080010001FE000200020002000200040064001800000 |
    |  2 | 020002000200020002000200020002000200020002000200FFF80000 |
    |  3 | FFF80200020002000200020002000200020002000200020002000000 |
    |  4 | 0010FFF80400040004000800080010002000C0000000000000000000 |
    |  5 | FFF802000200220023F0221042107FF0001000100020022001C00000 |
    |  6 | 7FF00210021012100C100610051008101010212040C00000FFF80000 |
    |  7 | 02002220222022202220FFF82220222022202220222022203FE00000 |
    |  8 | 7FF0020002003FF002000200FFF8040004000840082011F03E100000 |
    +----+----------------------------------------------------------+
    8 rows in set (0.03 sec)mysql> select id,hex(zk) from hanzhiku
        -> order by length(replace( BIN( zk^b'00011011111000001'),'1','')) desc limit 1;
    +----+----------------------------------------------------------+
    | id | hex(zk)                                                  |
    +----+----------------------------------------------------------+
    |  1 | FFF808000800080010001FE000200020002000200040064001800000 |
    +----+----------------------------------------------------------+
    1 row in set, 8 warnings (0.01 sec)mysql>
      

  7.   

    mysql> select id,hex(zk) from hanzhiku order by length(replace(BIN(zk^'0x7FF0020002003FF002000200FFF8040004000840082011F03E100000'),'0','')) desc limit 1;
    +-------+----------------------------------------------------------+
    | id    | hex(zk)                                                  |
    +-------+----------------------------------------------------------+
    | 17648 | 203833C048404440FBF8104010E0FCE09550595052483C40C0400000 |
    +-------+----------------------------------------------------------+
    1 row in set, 44606 warnings (0.30 sec)在这里先感谢一下!
    理解版主的意思,可是,计算结果不是想象的那样
    mysql> select max(id) from hanzhiku;
    +---------+
    | max(id) |
    +---------+
    |   22303 |
    +---------+
    1 row in set (0.00 sec)
    我直接取第8条记录的值,进行查询,可是,就是不把第8条排第一
      

  8.   

    在这里做了个实验
    mysql> select hex(zk^0x203833C048404440FBF8104010E0FCE09550595052483C40C0400000)
     from hanzhiku where zk=0x203833C048404440FBF8104010E0FCE09550595052483C40C04000
    00;
    +--------------------------------------------------------------------+
    | hex(zk^0x203833C048404440FBF8104010E0FCE09550595052483C40C0400000) |
    +--------------------------------------------------------------------+
    | 52483C40C0400053                                                   |
    +--------------------------------------------------------------------+
    1 row in set, 1 warning (0.01 sec)mysql>
    这里计算机的计算就是错误的,数据的长度太长,超出了计算范围了
      

  9.   

    为什么楼主不愿意给出测试步骤? 不是已知a=00011011111000001
     (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式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)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  10.   

    很不好意思,
    其实测试很简单,就是取数据库中的某一个数据,当作查询条件
    前面所说的
    已知a=00011011111000001
    只不过打个比方,主要是为了描述算法时简单直观点,
    实际的数据是28个字节的二进制数据,
    使用这样的数据来描述算法,
    很难想象,会有几个人看的懂,
    而且和难以直观的表现出来
    比如,可以去数据库中的第二条记录
    020002000200020002000200020002000200020002000200FFF80000
    当作条件,查询出来的结果应该是第二条
    因为记录是不重复的
    接下来可以修改一点条件数据中的某一个字节,如:
    020002000200020001000200020002000200020002000200FFE80000
    继续验证查询,查询的结果应该也是第二条,
    或者,第二条记录应该在记录集的前排位置