我正在尝试计算在使用JOIN语法时如何返回带有关联值的行,首先应检查links
表以查看该行是否为NULL
,如果不是NULL
将JOIN
用于ON links.role_id = roles.role_id
如果行为NULl
,则NULL
。如果是people
,则使用SELECT roles.role_name
FROM
(
people_links links
LEFT OUTER JOIN people people ON links.person_id = people.person_id
LEFT OUTER JOIN roles roles ON links.role_id = roles.role_id OR links.role_id = people.role_id
)
表。
我的语法:
ON
基本上,在role_id
加入roles
语法时,它将从role_id
中使用的links
表返回相关值,因此它应该依赖links.role_id
表格优先,检查NULL
是否为people.role_id
,然后为links.role_id
返回JOIN
其他role_name
得到role_id
。
当我运行此查询时,它首先使用people
表中的links
,它应首先查看COALESCE
表。
我尝试使用role_id
,但只返回role_name
时应返回SELECT IF(links.role_id IS NOT NULL) links.role_id ELSE people.role_id ENDIF as join_value
FROM
(
people_links links
LEFT OUTER JOIN people people ON links.person_id = people.person_id
LEFT OUTER JOIN roles roles ON roles.role_id = join_value
)
,例如(伪代码):
{{1}}
答案 0 :(得分:3)
你可以写IF(links.role_id IS NOT NULL, links.role_id, people.role_id)
- 这是你的伪代码最接近的东西 - 但是写COALESCE(links.role_id, people.role_id)
更加惯用。
有关IF
的信息,请参阅§11.4 "Control Flow Functions" in the MySQL Reference Manual;有关COALESCE
的信息,请参阅§11.3.2 "Comparison Functions and Operators"。
答案 1 :(得分:0)
我认为代码清晰度我会有两个角色加入。一个来自角色,一个来自人与角色。即。
SELECT
COALESCE(links_roles.role_name, people_roles.role_name)
FROM
(
people_links links
LEFT OUTER JOIN people people ON links.person_id = people.person_id
LEFT OUTER JOIN roles link_roles ON links.role_id = link_roles.role_id
LEFT OUTER JOIN roles people_roles ON people.role_id = people_roles.role_id
)