我的处境很有趣。
下面是名为“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_mirNULL以便您可以使用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;

09-16 03:35