我的处境很有趣。
下面是名为“mirror_data”=>
+------------+--------------+------+-----+---------+----------------+
| 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 | |
+------------+--------------+------+-----+---------+----------------+
这里是第二个名为“data”的表
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | | 0 | |
| localParty | varchar(255) | YES | | NULL | |
| other columns ... |
+-----------------+--------------+------+-----+---------+-------+
我正在从数据表检索信息,但我希望,当(从“数据”表)列localParty等于(从“镜像数据”表)列local时,然后从local_mir列(也从“镜像数据”表)检索信息,否则,当标记的列不相等时,从localParty检索信息。但我想从“数据”表中检索全部信息。
以下是镜像数据插入值=>
+--------+--------+-----------+--------+------------+
| 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在这种情况下没有改变,因为在镜像数据表中有两个值(当它们更多时,就更有可能不收到预期的结果),我如何编写查询来实现我的目标?
只想从“data”表中检索全部信息,但是如果发生标记的情况(local=localparty),则使用changing(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;