MySQL - JOIN a OR b

三世轮回 提交于 2019-12-30 16:35:30

问题


Let's say I have a TABLE a in which a COLUMN data is the one to join on for 2 other tables (TABLE b and TABLE c) because I want to get a COLUMN info in b or c.
The thing is a.data will match only with b.data or only with c.data.

  • How can I get b.info or c.info based on a ?


How far did I try:

After many attempts with obviously wrong syntax, the best I did was in 2 queries:

SELECT b.info FROM a INNER JOIN b ON a.data = b.data
SELECT c.info FROM a INNER JOIN c ON a.data = c.data

I would like to achieve something that could look like this:

SELECT alias.info FROM a INNER JOIN (b OR c) AS alias ON a.data = alias.data


Why do I want to do this

Actually I can get the data I want and work with it using PHP. But I am making a huge process (unrelated to my question) instead of a good query and the page takes too much time to load.


回答1:


You can left join to both of the b and c tables, then use whichever info field is not NULL:

select coalesce(b.info, c.info) info
from a
  left join b on a.data = b.data
  left join c on a.data = c.data



回答2:


Try something like this:

SELECT IFNULL(b.info,c.info) AS info
FROM a
    LEFT JOIN b ON a.data = b.data
    LEFT JOIN c ON a.data = c.data



回答3:


If data is guaranteed to be UNIQUE in tables b and c

We can use outer join to attempt to get matching row from each of the tables, and then use expression in the SELECT list to test whether we got a matching row. For example:

SELECT a.data
     , IF(b.data IS NULL,IF(c.data IS NULL,NULL,'c'),'b') AS info_src
     , IF(b.data IS NULL,c.info,b.info) AS b_or_c_info
  FROM a
  LEFT
  JOIN b 
    ON b.data = a.data
  LEFT
  JOIN c
    ON c.data = a.data

If we find a matching row in b, then b.data is guaranteed to be non-NULL. We know the value is non-NULL because it satisfied an equality (=) comparison.

Note that IF is MySQL specific syntax. A more portable ANSI-standards compliant version

       CASE
         WHEN b.data IS NULL
         THEN c.info
         ELSE b.info
       END  AS b_or_c_info


来源:https://stackoverflow.com/questions/49944850/mysql-join-a-or-b

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!