如何从多个mysql表中获取结果,其中只有1个表保存所有关系
我有以下3个表,我正试图使用一个查询来读取数据来连接它们。表格包括用户、车辆和操作员。包含所有关系的主表是vehicles如何从多个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
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编码的数据?提取的迭代调用在代码样式方面没有太多好处,因此经济性似乎很差。我觉得这不是一个设计良好的数据库结构——它迫使您编写复杂且不必要的繁重查询。