2013-04-12 18 views
6

Câu hỏi của tôi khá cơ bản. Đó là về cách tôi có thể xây dựng truy vấn của mình bằng cách sử dụng khóa ngoài để chọn thông tin nhất định từ hai bảng?Cách sử dụng khóa ngoài khi truy vấn từ hai bảng

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_id là chìa khóa nước ngoài tại vehicle.car_owner bảng và khóa chính cho users bảng.

Vì vậy, ai đó đang tìm kiếm tất cả xe VW và tôi muốn có thông tin sau dưới dạng html (vâng, tôi biết rằng đây không phải là cách chính xác - tôi sử dụng điều này để đơn giản hóa ví dụ và hiển thị thông tin nào mỗi bảng đi):

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

cảm ơn trước.

Trả lời

10

Tôi không chắc chắn, nếu bạn hiểu những gì các phím nước ngoài được sử dụng cho. Một chìa khóa nước ngoài về cơ bản nói "cho mục này phải có một mục trong bảng cha". Bạn đã nói user_id is foreign key in vehicle table, điều này không rõ ràng đối với tôi.

Vì vậy, chúng ta hãy giả sử bạn có một định nghĩa bảng như thế này:

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) 
); 

Khi bạn muốn chèn một người dùng mới vào bảng, user_id phải là một mục nhập hiện có trong cột car_owner trong xe bảng.

Có khóa ngoại giao để triển khai quy tắc kinh doanh. Mỗi người dùng có nhất thiết phải là chủ sở hữu xe hơi không? Hay cách khác, mọi chiếc xe phải được sở hữu bởi ai đó? Nếu bạn có thể trả lời cả hai câu hỏi mà không, thì đừng thực hiện bất kỳ khóa ngoại nào cho trường hợp này. Nhưng làm như vậy, nếu bạn có thể trả lời có cho chắc chắn.

Để có được thông tin bạn đang tìm kiếm chỉ làm

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

Hi tombom. Xin lỗi vì phần giới thiệu sai lạc. Tôi đã thực hiện một số sửa đổi trong văn bản và bảng. Tôi nhận được điểm của các phím nước ngoài và 'có' là câu trả lời cho câu hỏi cuối cùng của bạn. Những gì tôi đã mất tích là điều JOIN. Bây giờ mọi thứ rõ ràng hơn rất nhiều với tôi. Cảm ơn nhiều. – Alordiel

2

Sử dụng THAM GIA:

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

Mở rộng: vehicles INNER JOIN users sẽ chỉ trả lại chiếc xe đó có chủ sở hữu. Nếu bạn muốn hiển thị ô tô có NULL cho chủ sở hữu hoặc chủ sở hữu đã xóa, thì hãy sử dụng vehicles LEFT JOIN users.

Đối vehicles INNER JOIN users đó cũng là một cách khác nhau có thể:

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

Sau đó chọn hàng phù hợp với các điều kiện từ sản phẩm Descartes của hai bảng.

2

Bạn cần SQL Tham gia, một cái gì đó như thế này -

SELECT vehicles.car_model, users.user_name, users.user_phone 
FROM vehicles 
JOIN users ON vehicles.car_owner = users.users_id 
Các vấn đề liên quan