曲径通幽论坛

标题: 多表查询 [打印本页]

作者: beyes    时间: 2012-7-2 16:35
标题: 多表查询
当需要从多个表中提取数据时,就需要用到多表查询技术。

现在假设表 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 之间的几位用户的发帖数情况,但实际上结果并不是我们想要的 --- 竟然统计出了几万条记录:
[attach]667[/attach]

造成这样的原因是,尽管我们限定要列出 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;

[attach]668[/attach]

正是使用了两边 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;





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2