2013-04-12 25 views
6

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

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 | 
+-------+----------+------------+ 

user_idvehicle.car_owner表的外键和users表的主键。

所以有人正在寻找所有的大众汽车,我想要填充下面的信息为HTML(是的,我知道这不是正确的方式 - 我用这只是为了简化示例,并显示哪些信息来自每张表):

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

在此先感谢。

回答

10

我不知道,如果你了解使用什么外键。外键基本上说“对于这个条目,父表中必须有一个条目”。你说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列中的现有条目。

外键用于实现业务规则。每个用户都必须成为车主吗?或者相反,每辆车都必须由某人拥有?如果你可以用no回答这两个问题,那么不要为这种情况实现任何外键。但是,如果你肯定回答肯定,那就这样做。

要得到你正在寻找的信息,只是做

SELECT 
* 
FROM 
vehicles 
INNER JOIN users ON vehicles.car_owner = users.user_id 
+0

嗨tombom。对于误导性介绍抱歉。我在文本和表格中做了一些修改。我明白了外键,'是'是你最后一个问题的答案。我错过的是JOIN的东西。现在事情对我来说更加清楚了。非常感谢。 – Alordiel

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

你需要SQL加入,这样的事情 -

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