关于一个多表联查的问题

九千里 发布于 2016/10/11 17:33
阅读 415
收藏 1

有两张表  表结构如下:

表info有id ,photo1id,photo2id,photo3id字段,

表photo有id和url字段,

info表的photo1id,photo2id,photo3id都是对应着photo的id字段。

photo1id,photo2id,photo3id未必是有值的。

------------------------------------------------------

该段文字表达可能苍白,可以看下面分隔号的例子表述。

给一个info的id值,能否用一条sql语句查出包含着该条id值的info记录以及该记录对应的photo?也就是仅仅显示一条记录包含着info和photo1,photo2,photo3,而不是多条包含着info和photo1,photo2,photo3d的记录。。。

不用left join 以及存储过程,我知道用left join 能获取到这样的记录,我就是想知道能否用嵌套select的形式 找出该条记录。

求大神。。

--------------------------------------------------

基于撸出血的说法,举例子比较清晰,所以我就举个例子,比如info表是代表着一个人的信息,photo表放着这个人的照片信息,一个人最多有三张照片,但是也可以没有照片,我就是想根据该用户的id值查出他的信息跟他的照片信息,但是不想用left join来查。

--------------------------------------------------

再详细说明下:

展现出来的样子:infoid,photo1id,photo1url,photo2id,photo2url,photo3id,photo3url

具体数据:

info 表

infoid
photo1id
photo2id
photo3id
10001 p001
p003

photo表

id url
p001 http://image.com/001.jpg
p002 http://image.com/002.jpg



加载中
1
太黑_thj
太黑_thj

引用来自“太黑的忧郁情怀”的评论

可以做到,不过这个有点坑,

select

a.infoid,a.photo1id, b.url as photo1url ,

a.photo2id, c.url as photo2url,

a.photo3id, d.url as photo3url

from info a ,(select url from photo where id=a.photo1id) b ,(select url from photo where id=a.photo2id) c,(select url from photo where id=a.photo3id) d

当年第一次接触sql的时候我就是这么干的

嗯  换一下就可以了
 select

a.infoid,a.photo1id, (select url from photo where id=a.photo1id)  as photo1url ,

a.photo2id,(select url from photo where id=a.photo2id) as photo2url,

a.photo3id, (select url from photo where id=a.photo3id)  as photo3url

from info a where infoid=
太黑_thj
太黑_thj
这个方式比较吃性能,这个方式是将表查了3遍photo表每张表再筛选一遍,总的筛选了3遍,要是用left join 的话只要查一遍photo 然后筛选一遍
九千里
九千里
试验过,的确可以,非常感谢,嘿嘿。 不过你说这么干的时候会坑吗? 我倒是觉得,如果综合所有的实现方式,这种方式从效率上讲未必差啊。。
0
首席撸出血
首席撸出血
这表述看着好累
九千里
九千里
回复 @首席撸出血 : 好了,再次编辑,看看这样的表述如何,99分了吧?哇哈哈哈哈哈哈
首席撸出血
首席撸出血
回复 @九千里 : 哥,你厉害,我要的结果是你两张表有哪些数据,和你最终要展示的数据的样子,看了半天我还是不知道你要怎么展示
九千里
九千里
回复 @首席撸出血 : 有道理,我给了个栗子
首席撸出血
首席撸出血
回复 @九千里 : 你好歹列举一下,文字的表达很苍白,不想去理你说的这个逻辑
九千里
九千里
哇擦,这还叫累,我自认为表达得挺清楚的啊,蓝瘦香菇
0
BIBD
BIBD

你想要的输出结果是什么样的?
infoid,photo1id,photo1url,photo2id,photo2url,photo3id,photo3url 这样的一行记录?

你的信息在两张表上,要输出在一起为什么不能用join呢?除了想发现其他方法以外,有什么必要的理由吗?

九千里
九千里
他当时说如果能不用left join 的sql,就算嵌套得很长,但是"表述"得能清楚一点,我想了下貌似有道理,所以就开始纠结了
九千里
九千里
对,就是infoid,photo1id,photo1url,photo2id,photo2url,photo3id,photo3url的形式,这样问的原因是有个同事问了我能不能不用left join,我想了下,想不出来,所以提问了.哈哈哈
0
太黑_thj
太黑_thj

可以做到,不过这个有点坑,

select

a.infoid,a.photo1id, b.url as photo1url ,

a.photo2id, c.url as photo2url,

a.photo3id, d.url as photo3url

from info a ,(select url from photo where id=a.photo1id) b ,(select url from photo where id=a.photo2id) c,(select url from photo where id=a.photo3id) d

当年第一次接触sql的时候我就是这么干的

九千里
九千里
报错了。。我用的是mysql,在嵌套查询语句里面找不到a...
0
BIBD
BIBD

不考虑性能和复杂度,单纯为了乐趣实现的话. 可以嵌套加行列转换函数(oracle是PIVOT,UNPIVOT),或者case when实现. mysql的函数你自己查吧. 但我就不具体做了.

0
乌龟壳
乌龟壳
select i.infoid, p.id, p.url from info i, photo p where i.photo1id = p.id
union all
select i.infoid, p.id, p.url from info i, photo p where i.photo2id = p.id
union all
select i.infoid, p.id, p.url from info i, photo p where i.photo3id = p.id



九千里
九千里
额额,我的想法是仅仅取出一条记录,我用的是Mysql,这条语句会取出多条。不过貌似用oracle的话,这条语句仅会取出一条吧??
0
乌龟壳
乌龟壳
select i.infoid, i.photo1id, p1.url 'photo1url', ...
from info i
left join photo p1 on i.photo1id = p1.id
left join photo p2 on i.photo2id = p2.id
left join photo p3 on i.photo3id = p3.id
九千里
九千里
用left join的确可以直接搞定啊= = 题目我也有说left join可以,但是像题目说的那样,我想要用嵌套sql的方式。。。不管如何还是谢谢了~~
乌龟壳
乌龟壳
@九千里 还要多复杂?
返回顶部
顶部