免费注册 查看新帖 |

Chinaunix

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

请教下这样的SQL语句要怎么写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-12 12:10 |只看该作者 |倒序浏览
有表a,b,c

a:
a_id;
a_b_id;

b:
a_b_id;
b_c_id;
won;
lost;

c:
b_c_id;
c_d_id;
point;

d:
c_d_id;
level;

1.现在知道表a的a_id, 能不能用一个sql语句拿到表c里的point和表b里的won,lost呢,(已解决)
2.比如在表c中我有5行

c_d_id   point
1             1
1             2
1             3
1             4
1             5
在表d中是这样的
c_d_id     level
   1             1
现在我在表d中插入了一行变成
c_d_id     level
    1             1
    2             2
而我想把在表c中point 为1,2这最后2名的c_d_id改为2也就是c会变成
c_d_id    point
2               1
2               2
1               3
1               4
1               5
这个sql语句怎么写呢,谢谢

谢谢,憋了一上午没写好

[ 本帖最后由 SanZhiYuan 于 2009-6-12 17:03 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-06-12 13:36 |只看该作者
第一个看明白了,第二个看的有点迷糊。所以写了一个第一个,不知道是不是你想要的。
mysql> select * from a;
+------+--------+
| a_id | a_b_id |
+------+--------+
|    1 |      1 |
|    2 |      2 |
+------+--------+


mysql> select * from b;
+--------+--------+-----+------+
| a_b_id | b_c_id | won | lost |
+--------+--------+-----+------+
|      1 |      1 | 100 |  200 |
|      2 |      2 | 300 |  500 |
+--------+--------+-----+------+


mysql> select * from c;
+--------+--------+-------+
| b_c_id | c_d_id | point |
+--------+--------+-------+
|      1 |      1 |  1000 |
|      1 |      1 |  2000 |
+--------+--------+-------+


mysql> select a.a_id,b.won,b.lost,c.point from a left join b on a.a_b_id=b.a_b_id left join c on b.b_c_id=c.b_c_id;

+------+------+------+-------+
| a_id | won  | lost | point |
+------+------+------+-------+
|    1 |  100 |  200 |  1000 |
|    2 |  300 |  500 |  2000 |
+------+------+------+-------+
2 rows in set (0.00 sec)



就是用两个LFET JOIN

[ 本帖最后由 No.6 于 2009-6-12 13:42 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-06-12 14:51 |只看该作者
感谢2楼,要的就是这样,谢谢

论坛徽章:
0
4 [报告]
发表于 2009-06-12 17:13 |只看该作者
继续求-。-

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
5 [报告]
发表于 2009-06-12 17:59 |只看该作者
问题2的需求还是不明确。
“而我想把在表c中point 为1,2这最后2名的c_d_id改为2也就是c会变成”
那么整个update的过程与d表有什么关系?
与d表插入的那一行又有什么关系?

是每当d插入新行就对c进行操作?
还是你只是相对某个level的值进行操作?
此外d表中的id和level在业务上始终相等么?

论坛徽章:
0
6 [报告]
发表于 2009-06-12 19:43 |只看该作者
原帖由 cenalulu 于 2009-6-12 17:59 发表
问题2的需求还是不明确。
“而我想把在表c中point 为1,2这最后2名的c_d_id改为2也就是c会变成”
那么整个update的过程与d表有什么关系?
与d表插入的那一行又有什么关系?

是每当d插入新行就对c进行操作 ...


不好意思,是我自己理解出了问题-。-
你说的是对的,update的过程和d表根本没有关系....
一直纠缠在d表的level列也要影响c表的SELECT,但是实际上没什么关系的....

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
7 [报告]
发表于 2009-06-12 21:39 |只看该作者
这样的话就简单了

update c  set c.c_d_id = c.c_d_id + 1
  where 2 > (select count(*) from c as tmp where tmp.point < c.point)


如果point的值不唯一那么把count(*) 改成 count(distinct point)

[ 本帖最后由 cenalulu 于 2009-6-12 21:42 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP