如题:BLOB字段是一个结构体,能否根据该结构体中的某个字段对数据表中的所有记录进行排序,或者选出该字段值最大的那条记录?谢谢大家!

解决方案 »

  1.   

    可以排序,但你想怎么排?这个结构你是如果储存的?create table t5 (
    id int primary key,
    c1 blob
    );insert into t5 values (1,0x123456);
    insert into t5 values (2,0x414243);
    mysql> create table t5 (
        ->  id int primary key,
        ->  c1 blob
        -> );
    Query OK, 0 rows affected (0.06 sec)mysql> insert into t5 values (1,0x123456);
    Query OK, 1 row affected (0.08 sec)mysql> insert into t5 values (2,0x414243);
    Query OK, 1 row affected (0.02 sec)mysql> select * from t5;
    +----+------+
    | id | c1   |
    +----+------+
    |  1 | 4V  |
    |  2 | ABC  |
    +----+------+
    2 rows in set (0.00 sec)mysql> select * from t5 order by c1 desc;
    +----+------+
    | id | c1   |
    +----+------+
    |  2 | ABC  |
    |  1 | 4V  |
    +----+------+
    2 rows in set (0.05 sec)
      

  2.   

    额,首先谢谢两位的关注!可能我说的不是太明白,现在再说下:
    结构体:
    struct tagRole {
    INT nID;
    char szName[32];
    INT nExp;
    ....
    };数据表data中Att字段存放的就是上面的那个结构体,当然了Att字段就是上面说的BLOB类型的,现在的问题是如何简便地得到data表中nExp值最大的那条记录?不知道我把问题描述清楚了没有 
      

  3.   

    to  ACMAIN_CHM :可能是我没有说太清楚,问题不是对整个BLOB字段排序,是对BLOB字段中的结构体的某个成员(比如nExp)进行排序。BLOB字段中存放的是一个tagRole类型的结构体变量,也只存放这个结构体,其它的东西不存储。
      

  4.   

    你是如何存储的?!建议你能select blobFld from yourTable
    然后选几条贴出来,看一下你的表中内容是什么?
    如果是二进制的 select hex(blobFld) from yourtable然后把对应的实际数据也贴出来,再把你基于这些样例期望的结果也说明一下。
      

  5.   

    to  ACMAIN_CHM : 简化的数据表(myData)结构,
    bValid, nID, szName, dwCreateTime, Att其中Att是BLOB类型的,它存放的是tagRole类型的变量的二进制形式(汗,我感觉自己表达能力有限...)可能的数据记录如下:
    1 1 张三 898234312 (1 张三 1000...) 二进制的内容不知道怎么写
    1 2 李四 898234314 (2 李四 1300...)
    1 3 王五 898234317 (3 王五 1250...)
    0 4 赵六 898234301 (4 赵六 2123...)
    ...
    ...
    现在要找出nExp最大的有效记录,比如例子中的李四。问题是Att中的数据都是二进制形式的,并且nExp并不是在Att字段的起始位置,所以直接对Att排序结果是不正确的。实际的数据在公司,我手头上没有,直接select出来的也是不可读的数据,即使贴出来应该也对这个问题没有太大的影响。我觉得已经把这个问题描述清楚了
      

  6.   

    如果是我,我需要
    select bValid, nID, szName, dwCreateTime, hex(Att) from yourtable ;这样可以查看 1 张三 1000 对应的BLOB的存储格式是什么。 然后再用 substr或者其它之类的截取算法得到nExp.感觉上。
    struct tagRole {
    INT nID;
    char szName[32];
    INT nExp;
    ....
    };
    nID 4 bytes, + szName 32 bytes = 36 bytes, 这样你的 nExp  会是 att[37-40] 但是需要验证。所以需要数据来测试。
      

  7.   


    恩,这样也可以。现在我们的系统中有个函数,可以将select出来的整个Att用memcpy到一个指向tagRole的指针(外部分配好内存),然后函数外部根据这个指针可以方便的获得nExp的内容。我的想法是遍历myData中所有的记录,依次比较出最大的nExp,自己感觉这种方式比较笨,不知道MySql中有没有类似 select max(nID) from myData这样针对二进制字段形式的语句来使用?nExp在Att中的偏移量是确定的。
      

  8.   

    你可以直接用 max(substr(hex(att),37,4)) 直接得到。
      

  9.   


    hex(att)后,计数不再以字节单位计算,而是半个字节(一个hex码)为单位,所以应该是
    substring(hex(att),73,8)), 
    这样得到的是二进制数据,还需要转换为当作整数格式才能正确的得到最大值
    max(reverse(unhex(substring(hex(att),73,8)))),
    hex,unhex,貌似做了无用功,所以我使用的是
    max(reverse(mid(att,37,4)))问题解决,结贴。