0

我得到了这个,我想为每个人获取他们的“公司”名称。

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`

但是表“reserv”中有一些人不存在“idCompany”。所以在这种情况下,这个查询只显示在“公司”表中存在“id”的人。如果没有公司,我想显示没有公司的人,并且 company.name 的空格为空白

即使使用连接,我也尝试了很多方法,但我无法修复它。我也厌倦了写“公司”。

4

3 回答 3

1

您可以LEFT JOIN为此目的 使用 -

reserv r LEFT JOIN company c ON r.idCompany = c.id
于 2017-06-19T15:35:54.323 回答
1

您应该改用左连接。

SQL 左连接

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
于 2017-06-19T15:39:04.363 回答
0

ANSI 89 标准,对表连接使用表示法,连接标准位于 where 子句中。但是我不相信 mySQL 支持解决您的问题所需的这种外部连接样式。要在此语法中表达外连接,您需要使用*=for left join 或=*for right join;但再次不确定 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
于 2017-06-19T15:48:58.433 回答