Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29956103
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Mysql/postgreSQL

2010-06-01 15:43:11

MYSQL一个查询语句引起的

情况是这样的。我有一个表A字段如下:

ID  编号    IP    

记录示例

1   SN00001     19.2.3.3   

2   SN00001     192.365.336.33

含义就表示:一台服务器定义了两个IP

现在我的另外一个表里面的保存的是这台服务器的性能数据B表。

记录示例

1   SN00001     19.2.3.3

其中这个IP值是随机的一个IP(即有可能是外网IP也有可能是内网IP

查询的时候的SQL语句:

select distinct c.* from B c,A a

where a.ip = c.server_ip and a.server_ip = '124.222.222.222'

这样查询的话我们可以这样来理解这句SQL语句的含义

这个SQL语句分析从右边往左边来分析。

第一步:a.server_ip = '124.222.222.222'

提取A表里面符合条件的记录。这样的话就是全部的外网IP记录了。

第二步:定义a.ip = c.server_ip

其实这个时候的server_ip已经是外网IP了。所以在我们的B表肯定是找不到记录了。

 

进一步:

select distinct c.* from B c,A a,A b

where a.ip = c.server_ip and a.id=b.id and a.server_ip = '124.222.222.222'

这样就可以。为什么呢?解释一下

 

1步:依据a.server_ip = '124.222.222.222'

提取这一步。会返回一个小的结果集。这个结果集其实是

相当于做了这样的一个SQL

Select * from A a,A b where a.ip = ‘’

这个其实是相当于是A*A做了笛卡尔积处理。返回的是:

1   SN00001     19.2.3.3   

2   SN00001     192.365.336.33

即这两个IP还是会提取出来。

有了这个结果集之后再进一步查询a.ip = c.server_ip

会将那个数据集进一步分割过滤。

即进一步做笛卡尔积处理

 

阅读(733) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~