没有多个子查询,我想不出一个查询此问题的好方法。我无法重组表,所以这不是一种选择。设置如下:
person: person_id person_want_id, person_need_id, person_ability_id, person_willingness_id person_status_types: status_type_id status_type_name
面对面的每个ID的类型均为person_status_types。我需要提取的是每个id的本人的status_type_name。
所以return语句看起来像这样:
person_id | person_want_name | person_need_name | person_ability_name | person_willingness_name
现在,我只在做4个子查询,但是必须有一种更清洁的方法。另外,如果您想提一个更好的数据库结构,我也很乐意为将来的数据库生产做准备。
SELECT p.person_id ,want.status_type_name AS person_want_name ,need.status_type_name AS person_need_name ,abt.status_type_name AS person_ability_name ,wil.status_type_name AS person_willingness_name FROM person p LEFT JOIN person_status_types want ON p.person_want_id = want.status_type_id LEFT JOIN person_status_types need ON p.person_need_id = need.status_type_id LEFT JOIN person_status_types abt ON p.person_ability_id = abt.status_type_id LEFT JOIN person_status_types wil ON p.person_willingness_id = wil.status_type_id
使用LEFT JOIN以免丢失行。 而且您不能单引号标识符(如另一个答案所示)。单引号表示值。
LEFT JOIN
由于这引发了一些辩论,因此一劳永逸地澄清一下:
"
SET sql_mode = 'ANSI';
一些RDBMS接受其他替代分隔符,例如[]用于SQL Server。
[]
单引号 '限定 值 根据ANSI标准。一些RDBMS(例如MySQL或SQL Server)允许它们在列名周围作为通用字符串定界符。两者都不接受表名周围的内容。
'
*麓作为标识符分隔符的 *反引号 仅是MySQL的奇数。同样,您可以使用以下方法在MySQL中修复此问题:SET sql_mode = 'ANSI';
麓
这是数据库及其标识符的分隔符的列表。