从两个表查询时如何使用外键

时间:2013-04-12 10:36:48

标签: php mysql sql

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

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_ownervehicles表中的外键,它引用user_id表的主键users

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

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

提前感谢。

4 个答案:

答案 0 :(得分:11)

我不确定,如果您了解外键的用途。外键基本上表示“对于此条目,必须在父表中有一个条目”。你说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

答案 1 :(得分:2)

使用JOIN:

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

后者选择与两个表的笛卡尔积相匹配的行。

答案 2 :(得分:2)

你需要SQL Join,就像这样 -

SELECT vehicles.car_model, users.user_name, users.user_phone
FROM vehicles
JOIN users ON vehicles.car_owner = users.users_id

答案 3 :(得分:1)

从学习者的角度来看,令人惊讶的是外键似乎不能在查询中链接表格中起作用:即上面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

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