请教一个多表连接查询sql语句问题

【图片】多表联查,多对多联查询出来的数据问题【php吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:136,162贴子:
多表联查,多对多联查询出来的数据问题收藏
php学习选达内,O基础入学,名师指导1-4个月从入门到精通,先就业后付款「需高中以上!南昌php培训,达内培训O基础变php高手!免费培训7天试学
如图所示,我按照手册写的,应该是对的,但是出来的数据不对,是空的。也不报错,也不提示什么错误,下图是出来的数据,数组是空的,但是确实是有数据的
女友突然发来消息:“我看错你了!”我一下子慌了,看来瞒不住只好坦白:“你听我解释!是你闺蜜先勾引我的!”消息发出去的同时,收到女友的第二条消息: “刚路上有一男的背影发型跟你一模一样!”
我就受不了那些ORM框架,对于复杂关系查询,直接写SQL是最容易的,最高效的,最可靠的。
通知一下,昨天的那个问题已经解决了,是因为中间表的那个字段不是其他的表的主键,所以查询不出来数据,写法是没有问题的。下图是出来的数据。是我想要的格式,就是这样的。
登录百度帐号推荐应用关于一个多表联查的问题
有两张表 &表结构如下:
表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
具体数据:
引用来自“太黑的忧郁情怀”的评论
可以做到,不过这个有点坑,
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的时候我就是这么干的
嗯& 换一下就可以了
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=
--- 共有 2 条评论 ---
这个方式比较吃性能,这个方式是将表查了3遍photo表每张表再筛选一遍,总的筛选了3遍,要是用left join 的话只要查一遍photo 然后筛选一遍
试验过,的确可以,非常感谢,嘿嘿。
不过你说这么干的时候会坑吗?
我倒是觉得,如果综合所有的实现方式,这种方式从效率上讲未必差啊。。
这表述看着好累
--- 共有 5 条评论 ---
: 好了,再次编辑,看看这样的表述如何,99分了吧?哇哈哈哈哈哈哈
: 哥,你厉害,我要的结果是你两张表有哪些数据,和你最终要展示的数据的样子,看了半天我还是不知道你要怎么展示
: 有道理,我给了个栗子
: 你好歹列举一下,文字的表达很苍白,不想去理你说的这个逻辑
哇擦,这还叫累,我自认为表达得挺清楚的啊,蓝瘦香菇
你想要的输出结果是什么样的?
infoid,photo1id,photo1url,photo2id,photo2url,photo3id,photo3url 这样的一行记录?
你的信息在两张表上,要输出在一起为什么不能用join呢?除了想发现其他方法以外,有什么必要的理由吗?
--- 共有 2 条评论 ---
他当时说如果能不用left join 的sql,就算嵌套得很长,但是"表述"得能清楚一点,我想了下貌似有道理,所以就开始纠结了
对,就是infoid,photo1id,photo1url,photo2id,photo2url,photo3id,photo3url的形式,这样问的原因是有个同事问了我能不能不用left join,我想了下,想不出来,所以提问了.哈哈哈
可以做到,不过这个有点坑,
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的时候我就是这么干的
--- 共有 1 条评论 ---
报错了。。我用的是mysql,在嵌套查询语句里面找不到a...
不考虑性能和复杂度,单纯为了乐趣实现的话. 可以嵌套加行列转换函数(oracle是PIVOT,UNPIVOT),或者case when实现. mysql的函数你自己查吧. 但我就不具体做了.
id, p.id, p.url from info i, photo p where i.photo1id = p.id
id, p.id, p.url from info i, photo p where i.photo2id = p.id
id, p.id, p.url from info i, photo p where i.photo3id = p.id
--- 共有 1 条评论 ---
额额,我的想法是仅仅取出一条记录,我用的是Mysql,这条语句会取出多条。不过貌似用oracle的话,这条语句仅会取出一条吧??
id, 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
--- 共有 2 条评论 ---
用left join的确可以直接搞定啊= =
题目我也有说left join可以,但是像题目说的那样,我想要用嵌套sql的方式。。。不管如何还是谢谢了~~
还要多复杂?1301人阅读
数据库应用(56)
作者:iamlaosong
多表连接查询中最常用的事内连接,内连接中最常用的是等值连接,即在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。例如:
select * &from tb_evt_mail_clct a, tb_evt_dlv c
&where a.clct_date between to_date('', 'yyyy-mm-dd') and
& & & &to_date('', 'yyyy-mm-dd')
& &and a.mail_num=c.mail_
上述查询中,A表(收寄表)和C表(投递表)中的邮件号码mail_num不一定是一一对应的,有可能A表中存在的,C表中不存在,按上面的语句查询,这些邮件将不会出现,如果需要出现,我们一般在等式的右边添加一个“(+)”,这样就可以列出A表中的所有内容,如下所示:
select * &from tb_evt_mail_clct a, tb_evt_dlv c
&where a.clct_date between to_date('', 'yyyy-mm-dd') and
& & & &to_date('', 'yyyy-mm-dd')
& &and a.mail_num=c.mail_num(+);
如果我们要统计A表中存在C表中不存在的邮件量(未投递邮件量),可以用下面语句:
select count(*) &from tb_evt_mail_clct a, tb_evt_dlv c
&where a.clct_date between to_date('', 'yyyy-mm-dd') and
& & & &to_date('', 'yyyy-mm-dd')
& &and a.mail_num=c.mail_num(+)
& &and c.mail_num is null;
我们可以用下面语句统计妥投邮件量,妥投的条件是c.dlv_sts_code = 'I',即:
select count(*) &from tb_evt_mail_clct a, tb_evt_dlv c
&where a.clct_date between to_date('', 'yyyy-mm-dd') and
& & & &to_date('', 'yyyy-mm-dd')
& &and a.mail_num=c.mail_num(+)
& &and c.dlv_sts_code = 'I';
但是如果我们需要统计未妥投邮件量,下面语句是不成立的,统计的结果为0:
select count(*) &from tb_evt_mail_clct a, tb_evt_dlv c
&where a.clct_date between to_date('', 'yyyy-mm-dd') and
& & & &to_date('', 'yyyy-mm-dd')
& &and a.mail_num=c.mail_num(+)
& &and c.dlv_sts_code = 'I'
& &and c.mail_
这是因为,c.mail_num is null这个条件成立时,c.dlv_sts_code 的值也是null,不可能等于‘I',所以,统计的结果为0,也就是说,当统计C表mail_num为空的量时,是不能用其它筛选条件的,确实需要统计的话,需要用下面语句:
select count(*) &from tb_evt_mail_clct a
&where a.clct_date between to_date('', 'yyyy-mm-dd') and
& & & &to_date('', 'yyyy-mm-dd')
& &and not exists (select 1
& & & & & from tb_evt_dlv c
& & & & &where c.mail_num = a.mail_num
& & & & & &and c.dlv_sts_code = 'I')
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1384418次
积分:12999
积分:12999
排名:第1019名
原创:256篇
转载:67篇
评论:171条
(6)(6)(8)(6)(6)(4)(4)(10)(9)(6)(7)(8)(6)(5)(5)(7)(2)(5)(4)(4)(7)(8)(4)(6)(6)(6)(7)(8)(5)(7)(4)(4)(9)(6)(5)(7)(9)(8)(6)(3)(6)(2)(4)(2)(3)(2)(1)(1)(3)(1)(1)(3)(3)(1)(1)(1)(1)(2)(1)(1)(1)(2)(3)(4)(2)(3)(2)(2)(5)(1)(1)(1)(1)(4)(1)(1)(3)2015年2月 Java大版内专家分月排行榜第二2014年3月 Java大版内专家分月排行榜第二
2014年9月 Java大版内专家分月排行榜第三2014年6月 Java大版内专家分月排行榜第三2014年2月 Java大版内专家分月排行榜第三2013年11月 Java大版内专家分月排行榜第三2013年10月 Java大版内专家分月排行榜第三
2015年2月 Java大版内专家分月排行榜第二2014年3月 Java大版内专家分月排行榜第二
2014年9月 Java大版内专家分月排行榜第三2014年6月 Java大版内专家分月排行榜第三2014年2月 Java大版内专家分月排行榜第三2013年11月 Java大版内专家分月排行榜第三2013年10月 Java大版内专家分月排行榜第三
2015年2月 Java大版内专家分月排行榜第二2014年3月 Java大版内专家分月排行榜第二
2014年9月 Java大版内专家分月排行榜第三2014年6月 Java大版内专家分月排行榜第三2014年2月 Java大版内专家分月排行榜第三2013年11月 Java大版内专家分月排行榜第三2013年10月 Java大版内专家分月排行榜第三
2015年2月 Java大版内专家分月排行榜第二2014年3月 Java大版内专家分月排行榜第二
2014年9月 Java大版内专家分月排行榜第三2014年6月 Java大版内专家分月排行榜第三2014年2月 Java大版内专家分月排行榜第三2013年11月 Java大版内专家分月排行榜第三2013年10月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 两表连接查询 的文章

 

随机推荐