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`

しかし、「idCompany」が存在しないテーブル「reserv」に何人かの人々がいます。その条件では、このクエリは、テーブル「会社」に既存の「ID」を持つ人のみを表示します。会社が無い人はアップして、会社が無い場合はcompany.nameのスペースを空欄で表示したい

結合でも多くの方法を試しましたが、修正できません。「会社」も書き疲れました。

4

3 に答える 3

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 に答える