如何从多个mysql表中获取结果,其中只有1个表保存所有关系

如何从多个mysql表中获取结果,其中只有1个表保存所有关系,mysql,sql,Mysql,Sql,我有以下3个表,我正试图使用一个查询来读取数据来连接它们。表格包括用户、车辆和操作员。包含所有关系的主表是vehicles users id | name 1 | Driver 1 2 | Driver 2 3 | Conductor 1 4 | Conductor 2 5 | Owner 1 6 | Owner 2 vehicles id | reg_num|driver_id | conductor_id | owner_id | operator_id 1 | KAN100X | 2

我有以下3个表,我正试图使用一个查询来读取数据来连接它们。表格包括用户、车辆和操作员。包含所有关系的主表是vehicles

users
id | name 
1 | Driver 1
2 | Driver 2
3 | Conductor 1
4 | Conductor 2
5 | Owner 1
6 | Owner 2


vehicles
id | reg_num|driver_id | conductor_id | owner_id | operator_id
1 | KAN100X | 2 | 4 | 6 | 2
2 | KCN200Y | 1 | 3 | 5 | 1


operators
id | name | type
1 | Operator 1 | Intercity
2 | Operator 2 | Intracity
我试过这个

class Vehicle{ 
    private $conn;

    // object properties
    public $id;
    public $name;
    public $reg_num;
    public $driver_id;
    public $conductor_id;
    public $owner_id;
    public $operator_id;
    public $type;

    function read(){
      
        $query = "
                SELECT * FROM vehicles
                LEFT JOIN users ON 'users.id' = 'vehicles.owner_id'
                LEFT JOIN users ON 'users.id' = 'vehicles.driver_id'
                LEFT JOIN users ON 'users.id = vehicles.coductor_id'
                LEFT JOIN users ON 'operators.id = vehicles.operator_id'
                ORDER BY 
                    'vehicles.id'
                DESC";

        // prepare query statement
        $stmt = $this->conn->prepare($query);

        // execute query
        $stmt->execute();

        return $stmt;
    }
}

// instantiate database and vehicle object
$database = new Database();
$db = $database->getConnection();

// initialize object
$vehicle = new Vehicle($db);




// query vehicle
$stmt = $vehicle->read();
$num = $stmt->rowCount();
  
// check if more than 0 record found
if($num>0){
  
    // vehicle array
    $vehicle_arr=array();
    $vehicle_arr["vehicle"]=array();
  
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){

        extract($row);                                                                          
  
        $vehicle_item = array(
            "vehicle_id" => $id,
            "vehicle_reg_num" => html_entity_decode($reg_num),
            "operator_name" => html_entity_decode($name),
            "operator_type" => html_entity_decode($type),
            "driver_name" => html_entity_decode($driver_name),
            "owner_name" => html_entity_decode($owner_name),
            "conductor_name" => html_entity_decode($conductor_name)

        );

        array_push($vehicle_arr["vehicle"], $vehicle_item);
    }
  
    // set response code - 200 OK
    http_response_code(200);
  
    // show vehicle data in json format

    echo json_encode(
        array("vehicle" => $vehicle_arr["vehicle"])
    );
}
else{
  
    // set response code - 404 Not found
    http_response_code(404);
  
    // tell the user no vehicle found
    echo json_encode(
        array("response_code" => 6, "response_message" => "No vehicle found.")
    );
}

如何重写查询以返回结果?

下面是一个查询示例。您没有提供足够的信息让我们明确地说这是您正在寻找的查询:

SELECT c.olumns
     , y.ou
     , a.ctually
     , n.eed
  FROM vehicles v
  LEFT 
  JOIN users o
    ON o.id = v.owner_id
  LEFT 
  JOIN users d
    ON d.id = v.driver_id
  LEFT 
  JOIN users c
     ON c.id = v.conductor_id
  LEFT 
  JOIN users u
    ON u.id = v.operator_id
 ORDER 
    BY v.id DESC

下面是一个查询示例。您没有提供足够的信息让我们明确地说这是您正在寻找的查询:

SELECT c.olumns
     , y.ou
     , a.ctually
     , n.eed
  FROM vehicles v
  LEFT 
  JOIN users o
    ON o.id = v.owner_id
  LEFT 
  JOIN users d
    ON d.id = v.driver_id
  LEFT 
  JOIN users c
     ON c.id = v.conductor_id
  LEFT 
  JOIN users u
    ON u.id = v.operator_id
 ORDER 
    BY v.id DESC

您的问题来自这样一个事实:您从多个表中检索同名的列,甚至多次从一个表中检索同名的列。 您不仅需要对列名应用别名,还需要对表应用别名,因为SQL不知道您所引用的表用户的联接版本

使用别名

 SELECT owners.name AS owner_name,
        drivers.name AS driver_name,
        conductors.name as conductor_name,
        operators.name AS operator_name,
        vehicle.id
 FROM vehicles
 LEFT JOIN users AS owners ON owner.id = vehicles.owner_id
 LEFT JOIN users AS drivers ON driver.id = vehicles.driver_id
 LEFT JOIN users AS conductors ON conductors.id = vehicles.conductor_id
 LEFT JOIN users AS operators ON operators.id = vehicles.operator_id
 ORDER BY 
     vehicles.id  DESC
添加您可能还需要的其他字段以选择此查询的部分

在PHP中,还需要这些字段的别名

顺便说一句:您的查询包含很多单引号。您可以使用backtics,但在我看来,不应该需要这些backtics

single quote: '
backtic: `

您的问题来自这样一个事实:您从多个表中检索同名的列,甚至多次从一个表中检索同名的列。 您不仅需要对列名应用别名,还需要对表应用别名,因为SQL不知道您所引用的表用户的联接版本

使用别名

 SELECT owners.name AS owner_name,
        drivers.name AS driver_name,
        conductors.name as conductor_name,
        operators.name AS operator_name,
        vehicle.id
 FROM vehicles
 LEFT JOIN users AS owners ON owner.id = vehicles.owner_id
 LEFT JOIN users AS drivers ON driver.id = vehicles.driver_id
 LEFT JOIN users AS conductors ON conductors.id = vehicles.conductor_id
 LEFT JOIN users AS operators ON operators.id = vehicles.operator_id
 ORDER BY 
     vehicles.id  DESC
添加您可能还需要的其他字段以选择此查询的部分

在PHP中,还需要这些字段的别名

顺便说一句:您的查询包含很多单引号。您可以使用backtics,但在我看来,不应该需要这些backtics

single quote: '
backtic: `

删除“users.id”和其他名称周围的单引号。它们被视为字符串每当您连接同一表的多个实例时,您需要为每个实例分配一个唯一的别名。为什么要在数据库中存储html\u实体\u编码的数据?提取的迭代调用在代码样式方面没有太多好处,因此经济性似乎很差。我觉得这不是一个设计良好的数据库结构——它迫使您编写复杂且不必要的繁重查询。请删除“users.id”和其他名称周围的单引号。它们被视为字符串每当您连接同一表的多个实例时,您需要为每个实例分配一个唯一的别名。为什么要在数据库中存储html\u实体\u编码的数据?提取的迭代调用在代码样式方面没有太多好处,因此经济性似乎很差。我觉得这不是一个设计良好的数据库结构——它迫使您编写复杂且不必要的繁重查询。