曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3631|回复: 0
打印 上一主题 下一主题

多表查询

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-7-2 16:35:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当需要从多个表中提取数据时,就需要用到多表查询技术。

现在假设表 pw_members 有一个字段 username 表示论坛里的用户名,另一个字段 uid 字段表示该用户所对应的 ID 值;而另一个表 pw_memberdata 里的有一个字段 postnum 表示用户所发表的帖子数,此外还有和 pw_members 表里相同的字段 uid 。现在希望列出用户名及其对应所发的帖子数。

尝试执行下面语句:
[Plain Text] 纯文本查看 复制代码
select username, postnum from pw_members, pw_memberdata where pw_members.uid between 9 and 11;

上面语句我们只是打算列出在 UID 在 9 和 11 之间的几位用户的发帖数情况,但实际上结果并不是我们想要的 --- 竟然统计出了几万条记录:


造成这样的原因是,尽管我们限定要列出 3 个 UID 的记录,但注意,这仅仅只是限定了 UID,而发帖数是没有做出限定的,因此,语句的执行结果是为这 3 个用户匹配了数据库中所有用户的发帖数情况。

正确的做法是使用下面的语句:
[Plain Text] 纯文本查看 复制代码
select username, postnum from pw_members, pw_memberdata where pw_members.uid = pw_memberdata.uid and pw_members.uid between 9 and 11;



正是使用了两边 uid 对应相等的这个限定条件,这样查询结果就正确了。

可以将上面的语句精简写成:
[Plain Text] 纯文本查看 复制代码
select A.username, B.postnum from pw_members as A, pw_memberdata as B where A.uid = B.uid and A.uid between 9 and 11;

上面使用 AS 来声明 A 和 B 分别是 pw_members 和 pw_memberdata 的替代,这样就省去了要敲打比较长的表名。


还可以用 LEFT JOIN  来实现同样的功能:
[Plain Text] 纯文本查看 复制代码
SELECT username, postnum FROM pw_members LEFT JOIN pw_memberdata ON pw_members.uid = pw_memberdata.uid WHERE  pw_members.uid BETWEEN 9 AND 11;


实际上,由于 pw_members 和 pw_memberdata 两张表由于有同样的字段 uid ,那么也可以使用 USING 关键字来获得相同的结果,如:
[Plain Text] 纯文本查看 复制代码
SELECT username, postnum FROM pw_members LEFT JOIN pw_memberdata USING(uid) WHERE pw_members.uid BETWEEN 9 AND 11;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-19 01:18 , Processed in 0.083099 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表