2012-01-08 119 views
1

我有这样一个有趣的情况。 这里的表名为 “mirror_data”=>缺少一些mysql查询结果

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id_mir  | int(11)  | NO | PRI | NULL | auto_increment | 
| local  | varchar(255) | YES |  | NULL |    | 
| local_mir | varchar(255) | YES |  | NULL |    | 
| remote  | varchar(255) | YES |  | NULL |    | 
| remote_mir | varchar(255) | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

这里被命名为第二个表 “数据”


+-----------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+-----------------+--------------+------+-----+---------+-------+ 
| id    | int(11)  | NO |  | 0  |  | 
| localParty  | varchar(255) | YES |  | NULL |  | 
| other columns ...            | 
+-----------------+--------------+------+-----+---------+-------+ 

我从检索数据表的信息,但我想的是,当(从“数据”表中)列localParty等于(来自“mirror_data”的表)本地列,然后从local_mir列(也来自“mirror_data”表)检索信息,否则当标记的列彼此不相等时, localParty。但我想从“数据”表中检索整个信息。

这里是mirror_data插入值=>

+--------+--------+-----------+--------+------------+ 
| id_mir | local | local_mir | remote | remote_mir | 
+--------+--------+-----------+--------+------------+ 
|  1 | 715715 | Something | NULL | NULL  | 
|  2 | 1000 | some  | NULL | NULL  | 
+--------+--------+-----------+--------+------------+ 

,这里是我的代码如何我 “做” 这个=>

select IF(o.localParty=m.local,m.local_mir,o.localParty) FROM data as o, mirror_data as m limit 0,10; 

而且这里导致此查询做什么(缺少一些值)=>

+---------------------------------------------------+ 
| IF(o.localParty=m.local,m.local_mir,o.localParty) | 
+---------------------------------------------------+ 
| Something           | 
| 715715           | 
| 14            | 
| 14            | 
| Something           | 
| 715715           | 
| Something           | 
| 715715           | 
| 978080           | 
| 943080           | 
+---------------------------------------------------+ 

就像你看到数715715是不是在这种情况下,因为在mirror_data TA改变ble是两个值(当他们会更多时,它会更有可能不会收到预期的结果),我如何编写查询来实现我的目标?

只是想要从“数据”表全部信息,而是不断变化的(localparty)如果标记的情况发生(本地= localparty)

回答

1

您应该使用LEFT JOIN,以包括来自data表从mirror_table时提供的所有信息和信息..

如果没有匹配,那么m.local_mir将是NULL,所以你可以使用IFNULL

编辑回答子问题的意见

SELECT 
    IFNULL(m.local_mir, o.localParty) as local, 
    IFNULL(m.remote_mir, o.remoteParty) as remote 
FROM 
    data as o 
    LEFT JOIN mirror_data as m 
     ON (o.localParty = m.local OR o.remoteParty = m.remote) 
LIMIT 
    0,10; 
+0

非常感谢,请回答一个问题太多,这个查询将会如何,如果我们增加远程,完全相同的列和表,只需重命名本地远程,请回答:) – DaHaKa 2012-01-08 19:55:07

+0

请当你看到答案,谢谢:) – DaHaKa 2012-01-08 20:24:06

+0

@DaHaKa,更新的答案.. – 2012-01-08 21:48:15

1

您有效连接表datamirror_data,但都没有加盟条件一个WHERE子句来定义这两个表是如何关联的。

SELECT 
    IF(o.localParty = m.local, m.local_mir, o.localParty) 
FROM 
    data as o, 
    mirror_data as m 
/* Need an equivalent column to join on */ 
WHERE o.some_column = m.some_related_column 
limit 0,10; 

使用新版,JOIN语法:

SELECT 
    IF(o.localParty = m.local, m.local_mir, o.localParty) 
FROM 
    data AS o, 
    JOIN mirror_data AS m ON o.some_column = m.some_related_column 
LIMIT 0, 10;