Chinaunix

标题: 请教下这样的SQL语句要怎么写 [打印本页]

作者: SanZhiYuan    时间: 2009-06-12 12:10
标题: 请教下这样的SQL语句要怎么写
有表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 编辑 ]
作者: No.6    时间: 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 编辑 ]
作者: SanZhiYuan    时间: 2009-06-12 14:51
感谢2楼,要的就是这样,谢谢
作者: SanZhiYuan    时间: 2009-06-12 17:13
继续求-。-
作者: cenalulu    时间: 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在业务上始终相等么?
作者: SanZhiYuan    时间: 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,但是实际上没什么关系的....
作者: cenalulu    时间: 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 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2