CREATE TABLE `userexpands` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `usercharge` int(11) DEFAULT NULL,
  `remain` int(11) NOT NULL DEFAULT '0',
  `sentcount` int(11) NOT NULL DEFAULT '0',
  `mscount` int(11) NOT NULL DEFAULT '0',
  `sent` int(11) NOT NULL DEFAULT '0',
  `recharge` int(11) unsigned NOT NULL DEFAULT '0',
  `time` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `usercharge` (`usercharge`),
  CONSTRAINT `userexpands_ibfk_1` FOREIGN KEY (`usercharge`) REFERENCES `usercharge` (`id`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;CREATE TABLE `usercharge` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `balance` int(11) NOT NULL DEFAULT '0',
  `sent` int(11) NOT NULL DEFAULT '0',
  `expand` int(11) NOT NULL DEFAULT '0',
  `cost` int(11) NOT NULL DEFAULT '750',
  `note1` varchar(255) DEFAULT NULL,
  `note2` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
userexpands表和usercharge表的关系是1对多,userexpands表中的usercharge指向usercharge表的主键。
现在想对userexpands表中所有time>mytime,usercharge不为空的记录进行更新。
更新如下:userexpands.sentcount = usercharge.sent, userexpands.sent = usercharge.expand。
请问如何写出这样联合两个表的数据对userexpands表中的数据进行更新的HQL或SQL语句?
本人初接触数据库,用的是Hibernate+MySQL。
我原来的想法是根据这两个表查询出所有符合条件的userexpands,再逐条对返回集合中的记录进行更行,更新的时候加载相应的usercharge数据。但是这样效率不高,所以求一条能够实现上述更新的HQL或SQL语句。

解决方案 »

  1.   

    LZ是想要把 userexpands.sentcount = usercharge.sent 更新为 userexpands.sent = usercharge.expand?这个需求没看明白!!!
      

  2.   

    不是,是想把userexpands.sentcout更新为usercharge.sent,即:userexpands.sentcount=usercharge.sent(这个的usercharge是userexpands通过外键关联得到的)
    同样把userexpands.sent更新为usercharge.expand。
    也就是一共更新userexpands表中的两个数据:sentcount和sent。这两个数据的来源为和该条记录相关联的usercharge表中的sent数据和expand数据。
      

  3.   

    帮忙啊!本人对Hibernate和SQL都是新手啊!
      

  4.   

    用Hibernate的话,生成userexpands表对应usercharge表是一对多的关系。
    在Userexpands对象中存在一个Usercharge的对象,对应usercharge字段如果仅涉及这两个表,可在userexpands表的映射文件中配置其lazy="false"属性。
    这样在查询出所有Userexpands中所有字段的同时就可以查询出对应的多个Usercharge对象的详细内容。你的意思是要把Userexpands对象中的sentcount更新为Usercharge对象中的sent,同时把Userexpands对象中的sent更新为Usercharge对象中的expand(不知道我这样理解是否符合你的需求)String sql = "update userexpands set sentcount=?,sent=? where.....";
    ===========================
    如果按hql语法的话,我觉得你的需求有问题,既然Userexpands对象中已经包含了对应的多个Usercharge对象,为什么还要把Usercharge对象中的字段再更新到Userexpands对象的字段中??要这些重复数据有什么用?
    你更新的时候无非就是为了方便展示,但是用hibernate中面向对象的对表进行操作也可以很方便的把数据展示出来
      

  5.   

    生成userexpands表对应usercharge表是多对一的关系,usercharge表的主键是userexpands表的外键。
    我的目的是根据usercharge表更新某个时间段的userexpands表的数据。
    想对userexpands表中所有time>mytime,usercharge不为空的记录进行更新。
      

  6.   

    生成userexpands表对应usercharge表是多对一的关系
    --那你的意思是usercharge是主表?userexpands是分表?update userexpands set sentcount=t2.sent,sent=t2.expand
    from userexpands as t1  left join usercharge as t2 on t1.=t2.
    where t1.time>mytime这个意思吗?
    还是觉得描述得摸摸忽忽的,,,你给个例子多愉快的
      

  7.   

    谢谢!就是你说的这个意思。usercharge是主表,userexpands表是从表。
    我试试你的sql先:)
      

  8.   

    额上面SQL是不完整的
    t1.=t2. 需要分别带两个表的关联字段
    还有最好用
    把left join替换成inner join -=-
    希望还没发生悲剧
      

  9.   

    例子如下:
    usercharge表有数据
    id  sent expand
    1    100  1000
    2    200  340
    userexpands表有数据
    id sentcount sent time         usercharge
    1    0        0   09-01-01           1
    2    0       0    09-02-01           1
    3    0        0   09-01-01           2
    4    0        0   09-02-01           2
    5    0        0   09-02-01           null
    假如现在将所有时间在09年1月30号之后且外键usercharge不为空的userexpands数据进行更新,那么
    符合条件的userexpands记录有2和4。
    2对应的usercharge的id为1,这里标记为2和1。
    2.sentcount = 1.sent = 100
    2.sent = 1.expand = 1000
    4对应的usercharge的id为2,这里标记为4和2。
    4.sentcount = 2.sent = 200
    4.sent = 2.expand = 340。
    更新完成后userexpands表的数据
    id sentcount sent  time         usercharge
    1    0        0     09-01-01           1
    2    100     1000   09-02-01           1
    3    0        0      09-01-01           2
    4    200     340    09-02-01           2
    5    0        0      09-02-01           null
    我试验了上面的sql语句,执行出错啊。
    org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: from near line 1, column 81 [update com.soochow.ecompex.dao.Userexpands set sentcount=t2.sent,sent=t2.expand from com.soochow.ecompex.dao.Userexpands as t1  left join Usercharge as t2 on t1.usercharge=t2.id where t1.time>= :monthtime and t2 !=null]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: unexpected token: from near line 1, column 81 [update com.soochow.ecompex.dao.Userexpands set sentcount=t2.sent,sent=t2.expand from com.soochow.ecompex.dao.Userexpands as t1  left join Usercharge as t2 on t1.usercharge=t2.id where t1.time>= :monthtime and t2 !=null]
      

  10.   

    因为如果存在
    userexpands 表有
    而usercharge 不存在,,且又满足 time>mytime 
    那些字段会因为没有对应的需要的填充的usercharge资料,全部被update成null
      

  11.   

    换成了inner join也不行啊。
    String q = "update Userexpands set sentcount=t2.sent, sent=t2.expand"+
    " from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge.id=t2.id"+
    " where t1.time>= :monthtime and t2 !=null";
      

  12.   

    额,我这里没有你那边的环境- -
    没有办法直接测试罗,,,
    我这个SQL语句是针对MSSQL写的
    难道说你的环境里面不支持update 使用from吗?
    你只有多调试下了- -
      

  13.   

    为什么要判断
    t2!=null呢?
    t2是个表的别名啊
      

  14.   

    是查询语句本身不对,不是执行语句出错,我是用hibernate输出sql执行语句的,执行语句还没有输出,说明没有产生真正的sql语句。给出的出错信息也是:
    org.hibernate.hql.ast.QuerySyntaxException
      

  15.   

    或者你再先尝试下 把:monthtime 替换成一个固定时间的字符看会报错不- -
    这样刷网页好痛苦,,有QQ吗?
      

  16.   

    我现在直接改成了
    String q = "update Userexpands set sentcount=t2.sent, sent=t2.expand"+
    " from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge.id=t2.id"+
    " where t1.time>= :monthtime";
    那个t2 !=null是不对,但是现在还是不行啊~~~~(>_<)~~~~ 
      

  17.   

    update Userexpands set sentcount=t2.sent, sent=t2.expand from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge=t2.id
    各位帮帮忙啊,这个sql语句到底是哪里错了?我在my sql里面执行不了,总说是语句错误。
    select* from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge=t2.id 这句可以运行,肯定是没错的。
      

  18.   

     不是吧? Hibernate可以自己搞定,干嘛还要自己写sql ,又不是用的ibatis   楼主  服你了
      

  19.   

    update Userexpands set sentcount=t2.sent, sent=t2.expand from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge=t2.id 
     
    最后加个 where 条件,比如
    where  id =100; 试试能不能成功。
      

  20.   

    Hibernate是通过笨方法搞定,效率不高啊。
      

  21.   

    不想啊,整个sql语句现在有错误
      

  22.   

    update Userexpands set sentcount=t2.sent, sent=t2.expand from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge=t2.id 在 sentcount=t2.sent, sent=t2.expand  在 sentcount 和 sent 加表名 ,是不是这个没有指明确切的对象啊。
      

  23.   

    加上了表名还是不行,在my sql里这句根本就不通过。郁闷~~~~(>_<)~~~~ 
      

  24.   

    ~~~~(>_<)~~~~ 看来要等到明年了