17

我的问题很基本。它是关于如何使用外键从两个表中选择某些信息来构建我的查询?

table vehicles
+-------+----------+------------+
| id_car| car_model| car_owner  |
+-------+----------+------------+
|  1    |       VW |         132|
+-------+----------+------------+
|  2    |       VW |         200|
+-------+----------+------------+
table users
+-------+----------+------------+
|user_id| user_name| user_phone |
+-------+----------+------------+
|  132  |     Peter|    555-555 |
+-------+----------+------------+
|  200  |      Jim |    555-333 |
+-------+----------+------------+

car_owner是表中的外键,vehicles它引用表的主键user_idusers

所以有人正在搜索所有大众汽车,我希望像 html 一样填充以下信息(是的,我知道这不是正确的方法 - 我使用它只是为了简化示例并显示每个表中的哪些信息) :

>    echo "Car model:". `vehicles.car_model`
>    echo "Car owner:". `users.user_name`
>    echo "Contacts: ". `users.user_phone`

提前致谢。

4

4 回答 4

16

我不确定,如果您了解外键的用途。外键基本上说“对于这个条目,父表中必须有一个条目”。你说user_id is foreign key in vehicle table,我不清楚。

所以,让我们假设你有一个这样的表定义:

CREATE TABLE vehicles
(`id_car` int, `car_model` varchar(2), `car_owner` int);


CREATE TABLE users
(`user_id` int, `user_name` varchar(5), `user_phone` varchar(7)
, CONSTRAINT `fk_your_foreign_key` FOREIGN KEY (user_id) REFERENCES vehicles(car_owner)
);

当您要向表中插入新用户时,user_id 必须是车辆表中 car_owner 列中的现有条目。

外键用于实现业务规则。每个用户都必须是车主吗?或者反过来说,每辆车都必须归某人所有吗?如果您可以对这两个问题都没有回答,那么就不要在这种情况下实现任何外键。但是,如果您可以肯定地回答“是”,请这样做。

要获得您正在寻找的信息,只需执行

SELECT 
* 
FROM 
vehicles 
INNER JOIN users ON vehicles.car_owner = users.user_id
于 2013-04-12T10:54:05.617 回答
2

使用连接:

SELECT * FROM vehicles INNER JOIN users ON (vehicles.car_owner=users.user_id)

扩展:vehicles INNER JOIN users将只返回有车主的汽车。如果要显示所有者为 NULL 或已删除所有者的汽车,请使用vehicles LEFT JOIN users.

因为vehicles INNER JOIN users还有另一种可能的方式:

SELECT * FROM vehicles, users WHERE vehicles.car_owner=users.user_id

后者从两个表的笛卡尔积中选择匹配条件的行。

于 2013-04-12T10:42:04.387 回答
2

你需要 SQL Join,像这样 -

SELECT vehicles.car_model, users.user_name, users.user_phone
FROM vehicles
JOIN users ON vehicles.car_owner = users.users_id
于 2013-04-12T10:43:24.297 回答
2

从学习者的角度来看,令人惊讶的是,外键似乎不是在查询中链接表的功能:即上面 3 个答案中给出的查询在没有外键的情况下工作。例如,对于最后一个示例,mysql 学习者会期望 mysql 从外键中隐式推断出 vehicle.car_owner = user.users_id 以便在查询时

SELECT vehicles.car_model, users.user_name, users.user_phone
FROM vehicles JOIN users

应该足够了。而查询代码:

 ON vehicles.car_owner = users.users_id

看起来像外键的冗余显式重新声明

于 2018-06-06T09:06:52.343 回答