Redian新闻
>
请教mySQL一条查询语句,有包子!
avatar
请教mySQL一条查询语句,有包子!# PhotoGear - 摄影器材
s*a
1
现在我有两个表,一个表中记录了所有ID两两对战的成绩,表有3列:ID1, ID2, score
第二个表中记录了所有ID对应的人名,两列,分别是ID 和name.
现在想任意输入两个人名,查询他们的对战成绩
应该怎样做?
谢谢!
avatar
d*u
2
ID 是unique的话为啥不用ID 做identity变量,把两个表link在一起,然后查询不就行
了……
avatar
s*a
3
表1里面ID1或者ID2都不一定是全集啊。。。
比如说表里面可能只有9527, 9534, 100
而没有 9534,9527这样的记录
avatar
d*u
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这样的记录

avatar
s*a
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 的变量加到表
: 二里也行……

avatar
p*f
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.
avatar
s*a
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.

avatar
p*f
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在这个例子里的用法么?谢谢!

avatar
x*3
9
这题无解
你2个table没有任何关联ref
3个id columns, id, id1, id2
怎么弄
avatar
s*a
10

名字是没有关联,可是id1和id2中的值都在id中有对应。

【在 x*******3 的大作中提到】
: 这题无解
: 你2个table没有任何关联ref
: 3个id columns, id, id1, id2
: 怎么弄

avatar
x*3
11

select tmp1.name,tmp2.name,score
from
(select id,name from t2 where [email protected]) tmp1
(select id,name from t2 where [email protected]) tmp2
t1
where t1.id1=tmp1.id and t1.id2=tmp2.id

【在 s****a 的大作中提到】
:
: 名字是没有关联,可是id1和id2中的值都在id中有对应。

avatar
k*t
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 [email protected]) tmp1
: (select id,name from t2 where [email protected]) tmp2
: t1
: where t1.id1=tmp1.id and t1.id2=tmp2.id

avatar
v*a
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'
: 包子啊

avatar
s*h
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)
avatar
s*a
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'
: 包子啊

avatar
s*a
16
包子发完了,谢谢!
avatar
k*t
17
选二的两TEMP TABLE COST 巨大

【在 s****a 的大作中提到】
: 包子发完了,谢谢!
avatar
s*a
18
再追加一个包子:
如果只指定一个人的名字,列出所有与他有关的对手以及得分,又怎么做?
我把xr的code按如下改了,结果出不来结果,无响应:
select tmp1.name,tmp2.name,score
from
(select id,name from t2 where [email protected]) tmp1
(select id,name from t2) tmp2
t1
where t1.id1=tmp1.id and t1.id2=tmp2.id
为什么呢?
avatar
k*t
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 [email protected]) tmp1
: (select id,name from t2) tmp2
: t1
: where t1.id1=tmp1.id and t1.id2=tmp2.id
: 为什么呢?

avatar
s*a
20

看懂了
mysql的语法那么自由啊
乱飞一气

【在 k****t 的大作中提到】
: 选二的两TEMP TABLE COST 巨大
avatar
k*t
21
包子

【在 s****a 的大作中提到】
:
: 看懂了
: mysql的语法那么自由啊
: 乱飞一气

avatar
s*a
22

不是发了么
不认帐啊

【在 k****t 的大作中提到】
: 包子
avatar
k*t
23
你不是追加一个包子么?

【在 s****a 的大作中提到】
:
: 不是发了么
: 不认帐啊

avatar
s*a
24

追加的问题你没答啊?
另外,我用了一下xr的查询,0.00秒;用了一下你的,0.72秒。
这。。。

【在 k****t 的大作中提到】
: 你不是追加一个包子么?
avatar
s*a
25
好吧,是我没看见你下面的东西。。。
补上。
avatar
x*3
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 的大作中提到】
: 好吧,是我没看见你下面的东西。。。
: 补上。

avatar
x*3
27

你第二个等于
select * from t2 当然不行
要去掉
还有where clause

【在 s****a 的大作中提到】
: 再追加一个包子:
: 如果只指定一个人的名字,列出所有与他有关的对手以及得分,又怎么做?
: 我把xr的code按如下改了,结果出不来结果,无响应:
: select tmp1.name,tmp2.name,score
: from
: (select id,name from t2 where [email protected]) tmp1
: (select id,name from t2) tmp2
: t1
: where t1.id1=tmp1.id and t1.id2=tmp2.id
: 为什么呢?

avatar
x*3
28


我是DBA啊
怎么了

【在 v***a 的大作中提到】
: 宣儿还号称靠这个吃饭的。。。
avatar
v*a
29
matlab精通不

【在 x*******3 的大作中提到】
:
: 囧
: 我是DBA啊
: 怎么了

avatar
x*3
30
no
never used

【在 v***a 的大作中提到】
: matlab精通不
avatar
x*3
31
咋了?

【在 v***a 的大作中提到】
: matlab精通不
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。