Mysql 如何在SQL中有条件地定义联接的ON值?

Mysql 如何在SQL中有条件地定义联接的ON值?,mysql,sql,join,Mysql,Sql,Join,我面临一个有条件联接的问题 这是我的问题: SELECT table_b.name FROM table_a LEFT JOIN table_b ON table_a.id = table_b.a_id id, a_id, ref_z, name ---------------------- 1 | 0 | 1 | James 2 | 0 | 2 | John 3 | 2 | 2 | John. S 4 | 0 | 3 | Martin 5 | 6

我面临一个有条件联接的问题

这是我的问题:

SELECT table_b.name
FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.a_id
id, a_id, ref_z, name
----------------------
1 | 0   |   1  | James
2 | 0   |   2  | John
3 | 2   |   2  | John. S
4 | 0   |   3  | Martin
5 | 6   |   3  | Martin. M
6 | 2   |   3  | Martin. M. Mr
我的表格的描述\u b:

SELECT table_b.name
FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.a_id
id, a_id, ref_z, name
----------------------
1 | 0   |   1  | James
2 | 0   |   2  | John
3 | 2   |   2  | John. S
4 | 0   |   3  | Martin
5 | 6   |   3  | Martin. M
6 | 2   |   3  | Martin. M. Mr
假设我有一个参数@a_id

我想联接表_a上的表_a和表_b。如果表_a.id=@a_id存在于0上,则联接表_a和表_b

因此,前一个查询的输出将是(@a_id=2):

有人有一个想法、一篇博客文章、一个手册页或其他任何东西可以引导我找到正确的查询吗

谢谢,

where a_id = 2 
您的联接可以使用(a_id)缩短为
,因为两列名称相同,没有歧义


对于谓词子句(
where

不应混淆on/using
,假设您只有一个表,这对我很有用

DECLARE @t TABLE
(
id int,
a_id int,
ref_z int,
name varchar(50)
)

INSERT INTO @t VALUES (1, 0, 1, 'James'),
(2, 0, 2, 'John'),
(3, 2, 2, 'John. S'),
(4, 0, 3, 'Martin'),
(5, 6, 3, 'Martin. M'),
(6, 2, 3, 'Martin. M. Mr')

DECLARE @a_id int = 2

SELECT COALESCE(table_b.name, (SELECT table_b2.name FROM @t AS table_b2 WHERE table_b2.a_id = 0 ORDER BY table_b2.id LIMIT 1)) AS name
FROM (
SELECT ref_z 
FROM @t AS table_z
GROUP BY ref_z
) AS table_z
LEFT OUTER JOIN @t AS table_b ON table_b.ref_z = table_z.ref_z AND table_b.a_id = @a_id
结果是:

James
John. S
Martin. M. Mr

还请注意,如果一个_id=0有多个匹配项,则这也将仅显示一条记录(第一条记录)。您可以尝试将IFNULL与子选择一起使用:

SELECT ifnull(table_b.name,(select s.name from table_a sa inner join table_b sb on sa.a_id = sb.a_id where sb.a_id = 0 limit 1)) as name 
FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.a_id;
恐怕还没有经过测试,但希望能有所帮助


另外-您希望如何处理多个_id=0的行?以上内容仅在有倍数的情况下返回第一行…

谢谢您的回答。问题是,如果您使用表b的id=1行,它不会与where子句一起返回。当它应该的时候,因为它应该是,如果存在一个带有@a_id的行,那么这一行就是另一个带有零的行。