我得到了这个,我想为每个人获得他们的“公司”名称。
SELECT `client`.`name`,`client`.`lastname`
FROM `check`,`reserv`,`client`
WHERE `check`.`idReserv`=`reserv`.`id`
AND `reserv`.`idPerson`=`client`.`id`
ORDER BY `check`.`id`
,我想从表“公司”获得每个人的“公司”名称。
所以我尝试了这个:
SELECT `client`.`name`,`client`.`lastname`, `company`.`name`
FROM `check`,`reserv`,`client`,`company`
WHERE `reserv`.`idCompany`=`company`.`id`
AND `check`.`idReserv`=`reserv`.`id`
AND `reserv`.`idPerson`=`client`.`id`
ORDER BY `check`.`id`
但表中有一些人“保留”并且“idCompany”不存在。所以在这种情况下,这个查询只显示在“公司”表中存在“id”的人。如果没有公司
,我想向没有公司的人展示company.name的空白即使使用连接,我尝试了很多方法,但我无法修复它。我也很愿意写“公司”。
答案 0 :(得分:1)
您可以将LEFT JOIN
用于此目的,例如 -
reserv r LEFT JOIN company c ON r.idCompany = c.id
答案 1 :(得分:1)
您应该使用LEFT join。
SELECT c.name, c.lastname, co.name
FROM check AS ck
LEFT JOIN reserv AS r ON(ck.idReserv = r.id)
LEFT JOIN client AS c ON(r.idPerson = c.id)
LEFT JOIN company AS co ON(r.idCompany = co.id)
ORDER BY c.id
答案 2 :(得分:0)
ANSI 89标准对表连接使用,
表示法,并且连接的条件在where子句中。但是,我不相信mySQL支持解决问题所需的外部联接方式。要在此语法中表达外部联接,您需要使用*=
进行左联接,或=*
进行右联接;但又不确定mySQL是否支持它。
所以在你的情况下:
SELECT `client`.`name`,`client`.`lastname`, `company`.`name`
FROM `check`,`reserv`,`client`,`company`
WHERE `reserv`.`idCompany`*=`company`.`id`
AND `check`.`idReserv`=`reserv`.`id`
AND `reserv`.`idPerson`=`client`.`id`
ORDER BY `check`.`id`
但是,我发现这种表示法难以阅读,并且不需要所有表/列名称的转义(保留字除外)......所以下面遵循ANSI 92标准,允许使用INNER和LEFT Join用于显式定义连接类型的语法。两种表示法都应该针对相同的执行计划进行优化,以便其中一种工作(如果mySQL支持* =表示法);它只是您选择使用哪种标准的问题。
SELECT client.name
, client.lastname
, company.name
FROM `check`
INNER JOIN reserv
on `check`.idReserv=reserv.id
INNER JOIN client
on reserv.idPerson=client.id
LEFT JOIN company
on reserv.idCompany=company.id
ORDER BY `check`.id