缺少一些mysql查询结果
问题描述:
我有这样一个有趣的情况。 这里的表名为 “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)
答
您应该使用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;
答
您有效连接表data
和mirror_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;
非常感谢,请回答一个问题太多,这个查询将会如何,如果我们增加远程,完全相同的列和表,只需重命名本地远程,请回答:) – DaHaKa 2012-01-08 19:55:07
请当你看到答案,谢谢:) – DaHaKa 2012-01-08 20:24:06
@DaHaKa,更新的答案.. – 2012-01-08 21:48:15