免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1848 | 回复: 9
打印 上一主题 下一主题

请教一条不算复杂的sql语句, [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-22 10:03 |只看该作者 |倒序浏览
desc table_test ;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| subject  | varchar(255) | NO   |     |         |       |
| DateTime | datetime     | YES  |     | NULL    |       |
| Id       | bigint(20)   | NO   | PRI | 0       |       |
+----------+--------------+------+-----+---------+-------+
这张表是为TOP5服务的,也就是说表里永远最多只有5条记录,那么下面就有两种情况:
1: 当改表记录小于五条时,执行insert into 操作;
2:找出该表内最老的一条记录,更新它的subject和DateTime,
     $id = select Id from table_test order by DateTime limit 1;  //找出时间最老的一条记录的ID,
     update table_test set subject = "XXX",DateTime=“YYY”  where Id = $id;    //更新此ID的字段
      (这两句如何合并成一句??)

问题:怎么用一句sql还完成,因为我要在C里调,尽量我不解析查询结果。我知道inert into 里有一个 ON DUPLICATE KEY UPDATE,可是我不知道在这里怎么实现

[ 本帖最后由 flyfeel 于 2009-5-22 10:05 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-22 10:16 |只看该作者
好象这个都不符合用on duplicate key update
使用on duplicate key update 要求表中有一个唯一索引,或是主建的。才可以。

不知道LZ是不是存储过程可以达到你的要求呢。

论坛徽章:
0
3 [报告]
发表于 2009-05-22 10:27 |只看该作者
那我想问个简单的,$id = select Id from table_test order by DateTime limit 1;  //找出时间最老的一条记录的ID,
     update table_test set subject = "XXX",DateTime=“YYY”  where Id = $id;    //更新此ID的字段
      这两句如何合并成一句??

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
4 [报告]
发表于 2009-05-22 10:35 |只看该作者
原帖由 flyfeel 于 2009-5-22 10:27 发表
那我想问个简单的,$id = select Id from table_test order by DateTime limit 1;  //找出时间最老的一条记录的ID,
     update table_test set subject = "XXX",DateTime=“YYY”  where Id = $id;    //更 ...

直接在id=后面写子语句啊。

论坛徽章:
0
5 [报告]
发表于 2009-05-22 11:37 |只看该作者
问题就是这个子句怎么写?
update table_test set subject = "XXX",DateTime=“YYY”  where Id =(select Id from table_test order by DateTime limit 1);
这样一直报错

论坛徽章:
0
6 [报告]
发表于 2009-05-22 12:52 |只看该作者

注意有子查询的update写法:

UPDATE table_test a,
(
    SELECT Id
    FROM table_test
    ORDER BY DateTime
    LIMIT 1
)b
SET a.subject = "XXX",
    a.DateTime= "YYY"
WHERE a.Id = b.Id

多写写就习惯了。

[ 本帖最后由 sunnyfun 于 2009-5-22 12:54 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-05-30 09:45 |只看该作者
where id in(select .....) 应该可以吧。

论坛徽章:
0
8 [报告]
发表于 2009-05-30 11:56 |只看该作者
学习了

论坛徽章:
0
9 [报告]
发表于 2009-06-01 15:17 |只看该作者

回复 #1 flyfeel 的帖子

不明白

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
10 [报告]
发表于 2009-06-01 15:21 |只看该作者
原帖由 prettywolf 于 2009-5-30 09:45 发表
where id in(select .....) 应该可以吧。



in是最容易想到的
你楼上的是比价好的


in的性能不好,但是在这个case中可能差别不大
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP