MySQL 中的空 ID,无法显示空答案
Empty id in MySQL, cannot show null answers
我知道了,我想得到他们每个人的 "company" 名字。
SELECT `client`.`name`,`client`.`lastname`
FROM `check`,`reserv`,`client`
WHERE `check`.`idReserv`=`reserv`.`id`
AND `reserv`.`idPerson`=`client`.`id`
ORDER BY `check`.`id`
,我想从 table "company" 中获取每个人的 "company" 名字。
所以我尝试了这个:
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`
但是 table "reserv" 中有些人 "idCompany" 不存在。所以在这种情况下,这个查询只显示 table "company" 中存在 "id" 的人。如果没有公司
,我想显示没有公司的人和company.name的space空白
我尝试了很多方法,即使是连接,但我无法修复它。我也写累了"company"
您可以使用 LEFT JOIN
来达到这个目的,例如-
reserv r LEFT JOIN company c ON r.idCompany = c.id
您应该改用 LEFT 联接。
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
ANSI 89 标准对 table 连接使用 ,
表示法,连接条件位于 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`
但是,我发现该符号难以阅读并且不需要所有转义 table/column 名称(保留字除外)...因此以下内容遵循允许使用的 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
我知道了,我想得到他们每个人的 "company" 名字。
SELECT `client`.`name`,`client`.`lastname`
FROM `check`,`reserv`,`client`
WHERE `check`.`idReserv`=`reserv`.`id`
AND `reserv`.`idPerson`=`client`.`id`
ORDER BY `check`.`id`
,我想从 table "company" 中获取每个人的 "company" 名字。
所以我尝试了这个:
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`
但是 table "reserv" 中有些人 "idCompany" 不存在。所以在这种情况下,这个查询只显示 table "company" 中存在 "id" 的人。如果没有公司
,我想显示没有公司的人和company.name的space空白我尝试了很多方法,即使是连接,但我无法修复它。我也写累了"company"
您可以使用 LEFT JOIN
来达到这个目的,例如-
reserv r LEFT JOIN company c ON r.idCompany = c.id
您应该改用 LEFT 联接。
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
ANSI 89 标准对 table 连接使用 ,
表示法,连接条件位于 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`
但是,我发现该符号难以阅读并且不需要所有转义 table/column 名称(保留字除外)...因此以下内容遵循允许使用的 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