s****a 发帖数: 6521 | 1 现在我有两个表,一个表中记录了所有ID两两对战的成绩,表有3列:ID1, ID2, score
第二个表中记录了所有ID对应的人名,两列,分别是ID 和name.
现在想任意输入两个人名,查询他们的对战成绩
应该怎样做?
谢谢! |
d*********u 发帖数: 8521 | 2 ID 是unique的话为啥不用ID 做identity变量,把两个表link在一起,然后查询不就行
了…… |
s****a 发帖数: 6521 | 3 表1里面ID1或者ID2都不一定是全集啊。。。
比如说表里面可能只有9527, 9534, 100
而没有 9534,9527这样的记录 |
d*********u 发帖数: 8521 | 4 不一定是全集,可是你的表一(包含分数的)是master file吧?
换句话说,你的表二有的ID,对应的某人姓名,如果此人的ID在表一查不到,那分数也
还是查不到的,没影响啊?只要用表1作为master file,然后用表二的文件做参考,把
表二中和表一相符的ID做identity,将其对应的人名当做新的变量加到表一不行么?
或者说你的比赛没打完,有的ID-人的分数还没出来,那也没关系,你只要确定所有参
赛者的ID和人名都在表二里,那就把表二作为master file,然后将表1 的变量加到表
二里也行……
【在 s****a 的大作中提到】 : 表1里面ID1或者ID2都不一定是全集啊。。。 : 比如说表里面可能只有9527, 9534, 100 : 而没有 9534,9527这样的记录
|
s****a 发帖数: 6521 | 5
给表1里加入两列人名是可行的
不过现在我想探讨两表查询的方法,因为实际上我的表二里每个人都有很多个别名、小
名之类的。。
把表1里的成绩加到表2里是不可能的,因为表1里每个record都包含两个ID,也就是说
两个ID确定一个score.
说清楚点就是,表1是这个样子的:
1号 2号 5:2
1号 3号 4:2
1号 4号 2:6
1号 5号。。。
。。。
。。
2号 3号 4:4
2号 4号 3:3
。。。。
。。。。
【在 d*********u 的大作中提到】 : 不一定是全集,可是你的表一(包含分数的)是master file吧? : 换句话说,你的表二有的ID,对应的某人姓名,如果此人的ID在表一查不到,那分数也 : 还是查不到的,没影响啊?只要用表1作为master file,然后用表二的文件做参考,把 : 表二中和表一相符的ID做identity,将其对应的人名当做新的变量加到表一不行么? : 或者说你的比赛没打完,有的ID-人的分数还没出来,那也没关系,你只要确定所有参 : 赛者的ID和人名都在表二里,那就把表二作为master file,然后将表1 的变量加到表 : 二里也行……
|
p*******f 发帖数: 521 | 6 1. write a simple stored procedure, or
2. use your code to pre-process the name->id look up, in the query just use
the ids, then post-process the id->name look up
3. create temp tables in subqueries if you really want all things to be done
in one query. |
s****a 发帖数: 6521 | 7
use
done
能举例一下subquery在这个例子里的用法么?谢谢!
【在 p*******f 的大作中提到】 : 1. write a simple stored procedure, or : 2. use your code to pre-process the name->id look up, in the query just use : the ids, then post-process the id->name look up : 3. create temp tables in subqueries if you really want all things to be done : in one query.
|
p*******f 发帖数: 521 | 8
e.g.
select * from
(select id, name.... from t1, t2 where....) temp1,
(select id, name.... from t1, t2 where....) temp2
where temp1... temp2.....
or you can have temp table inside another temp table.
【在 s****a 的大作中提到】 : : use : done : 能举例一下subquery在这个例子里的用法么?谢谢!
|
x*******3 发帖数: 8342 | 9 这题无解
你2个table没有任何关联ref
3个id columns, id, id1, id2
怎么弄 |
s****a 发帖数: 6521 | 10
名字是没有关联,可是id1和id2中的值都在id中有对应。
【在 x*******3 的大作中提到】 : 这题无解 : 你2个table没有任何关联ref : 3个id columns, id, id1, id2 : 怎么弄
|
|
|
x*******3 发帖数: 8342 | 11
select tmp1.name,tmp2.name,score
from
(select id,name from t2 where id=@id1) tmp1
(select id,name from t2 where id=@id2) tmp2
t1
where t1.id1=tmp1.id and t1.id2=tmp2.id
【在 s****a 的大作中提到】 : : 名字是没有关联,可是id1和id2中的值都在id中有对应。
|
k****t 发帖数: 12697 | 12 用不这这复杂, 俺老头子的解:
select p1.name, p2.name, score from
scores s inner join people p1
on s.id1=p1.idnumber
inner join people p2
on s.id2=p2.idnumber
where p1.name='chuck' and p2.name='john'
or p2.name='chuck' and p1.name='john'
包子啊
【在 x*******3 的大作中提到】 : : select tmp1.name,tmp2.name,score : from : (select id,name from t2 where id=@id1) tmp1 : (select id,name from t2 where id=@id2) tmp2 : t1 : where t1.id1=tmp1.id and t1.id2=tmp2.id
|
v***a 发帖数: 23651 | 13 宣儿还号称靠这个吃饭的。。。
【在 k****t 的大作中提到】 : 用不这这复杂, 俺老头子的解: : select p1.name, p2.name, score from : scores s inner join people p1 : on s.id1=p1.idnumber : inner join people p2 : on s.id2=p2.idnumber : where p1.name='chuck' and p2.name='john' : or p2.name='chuck' and p1.name='john' : 包子啊
|
s****h 发帖数: 3979 | 14 CREATE TABLE Match
(
player1 integer,
player2 integer,
score varchar(10)
)
CREATE TABLE Players
(
ID integer,
name varchar(10)
)
insert into Match
values
( 3, 2, '3:1'),
( 2, 1, '3:1'),
( 3, 1, '3:1'),
( 1, 2, '3:1'),
( 1, 3, '3:1'),
( 2, 3, '3:1')
insert into Players
values (1, 'A'),
(2, 'B'),
(3, 'C')
declare @P1 integer
declare @P2 integer
set @P1 = 1;
set @P2 = 3;
select P1.name, P2.name, M.score
from Match M
join Players P1 on P1.id = M.player1
join Players p2 on P2.id = M.player2
where (P1.id = @P1 and P2.id = @P2) or (P1.id = @P2 and P2.id = @P1) |
s****a 发帖数: 6521 | 15
其实。。。你们两个行数差不多,而且他的看起来还更好懂些~
看完再包子
【在 k****t 的大作中提到】 : 用不这这复杂, 俺老头子的解: : select p1.name, p2.name, score from : scores s inner join people p1 : on s.id1=p1.idnumber : inner join people p2 : on s.id2=p2.idnumber : where p1.name='chuck' and p2.name='john' : or p2.name='chuck' and p1.name='john' : 包子啊
|
s****a 发帖数: 6521 | |
k****t 发帖数: 12697 | 17 选二的两TEMP TABLE COST 巨大
【在 s****a 的大作中提到】 : 包子发完了,谢谢!
|
s****a 发帖数: 6521 | 18 再追加一个包子:
如果只指定一个人的名字,列出所有与他有关的对手以及得分,又怎么做?
我把xr的code按如下改了,结果出不来结果,无响应:
select tmp1.name,tmp2.name,score
from
(select id,name from t2 where id=@id1) tmp1
(select id,name from t2) tmp2
t1
where t1.id1=tmp1.id and t1.id2=tmp2.id
为什么呢? |
k****t 发帖数: 12697 | 19 吃
select p1.name, p2.name, score from
scores s join people p1
on s.id1=p1.idnumber
join people p2
on s.id2=p2.idnumber
where p1.name='chuck' or p2.name='chuck'
【在 s****a 的大作中提到】 : 再追加一个包子: : 如果只指定一个人的名字,列出所有与他有关的对手以及得分,又怎么做? : 我把xr的code按如下改了,结果出不来结果,无响应: : select tmp1.name,tmp2.name,score : from : (select id,name from t2 where id=@id1) tmp1 : (select id,name from t2) tmp2 : t1 : where t1.id1=tmp1.id and t1.id2=tmp2.id : 为什么呢?
|
s****a 发帖数: 6521 | 20
看懂了
mysql的语法那么自由啊
乱飞一气
【在 k****t 的大作中提到】 : 选二的两TEMP TABLE COST 巨大
|
|
|
k****t 发帖数: 12697 | 21 包子
【在 s****a 的大作中提到】 : : 看懂了 : mysql的语法那么自由啊 : 乱飞一气
|
s****a 发帖数: 6521 | 22
不是发了么
不认帐啊
【在 k****t 的大作中提到】 : 包子
|
k****t 发帖数: 12697 | 23 你不是追加一个包子么?
【在 s****a 的大作中提到】 : : 不是发了么 : 不认帐啊
|
s****a 发帖数: 6521 | 24
追加的问题你没答啊?
另外,我用了一下xr的查询,0.00秒;用了一下你的,0.72秒。
这。。。
【在 k****t 的大作中提到】 : 你不是追加一个包子么?
|
s****a 发帖数: 6521 | |
x*******3 发帖数: 8342 | 26
这个是原因:
唐老的语句:
set profiling=1;
select t2.name, t3.name, score from
t1 inner join t2
on t1.p1=t2.p
inner join t2 t3
on t1.p2=t3.p
where t2.name like 'a' and t3.name like 'c';
set profiling=0;show profile;
结果:
+--------------------------------+-----------+
| Status | Duration |
+--------------------------------+-----------+
| (initialization) | 0.000093 |
| checking query cache for query | 0.000174 |
| Opening tables | 0.000121 |
| System lock | 0.0001 |
| Table lock | 0.000139 |
| init | 0.000145 |
| optimizing | 0.000125 |
| statistics | 0.000121 |
| preparing | 0.000133 |
| executing | 0.000101 |
| Sending data | 0.000425 |
| end | 0.000137 |
| query end | 0.000096 |
| storing result in query cache | 0.000098 |
| freeing items | 0.000102 |
| closing tables | 0.000105 |
| logging slow query | 0.0000950 |
+--------------------------------+-----------+
17 rows in set (0.00 sec)
我的:
set profiling=1;
select tmp1.name,tmp2.name,score
from
(select p,name from t2 where name like 'a')tmp1,
(select p,name from t2 where name like 'c')tmp2,
t1
where t1.p1=tmp1.p and t1.p2=tmp2.p;
我的:
+--------------------------------+-----------+
| Status | Duration |
+--------------------------------+-----------+
| (initialization) | 0.0000889 |
| checking query cache for query | 0.000097 |
| checking privileges on cached | 0.0000939 |
| sending cached result to clien | 0.000097 |
| logging slow query | 0.000092 |
+--------------------------------+-----------+
5 rows in set (0.00 sec)
这是为什么我的语句快
但是写起来唐老的简单写
算法上俺地快
【在 s****a 的大作中提到】 : 好吧,是我没看见你下面的东西。。。 : 补上。
|
x*******3 发帖数: 8342 | 27
你第二个等于
select * from t2 当然不行
要去掉
还有where clause
【在 s****a 的大作中提到】 : 再追加一个包子: : 如果只指定一个人的名字,列出所有与他有关的对手以及得分,又怎么做? : 我把xr的code按如下改了,结果出不来结果,无响应: : select tmp1.name,tmp2.name,score : from : (select id,name from t2 where id=@id1) tmp1 : (select id,name from t2) tmp2 : t1 : where t1.id1=tmp1.id and t1.id2=tmp2.id : 为什么呢?
|
x*******3 发帖数: 8342 | 28
囧
我是DBA啊
怎么了
【在 v***a 的大作中提到】 : 宣儿还号称靠这个吃饭的。。。
|
v***a 发帖数: 23651 | 29 matlab精通不
【在 x*******3 的大作中提到】 : : 囧 : 我是DBA啊 : 怎么了
|
x*******3 发帖数: 8342 | 30 no
never used
【在 v***a 的大作中提到】 : matlab精通不
|
|
|
x*******3 发帖数: 8342 | 31 咋了?
【在 v***a 的大作中提到】 : matlab精通不
|