问题
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
orc.info
based ona
?
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