2009-09-12 28 views
5

Tôi có một bảng dự án có hai khóa ngoại cho người dùng (user_id và winner_user_id), một cho chủ sở hữu của dự án và một cho người chiến thắng của dự án. Một cái gì đó nhưSQL, Cách truy vấn với nhiều khóa ngoài trong một bảng?

+----------------+-------------------------+------+-----+---------+----------------+ 
| Field   | Type     | Null | Key | Default | Extra   | 
+----------------+-------------------------+------+-----+---------+----------------+ 
| project_id  | int(10) unsigned  | NO | PRI | NULL | auto_increment | 
| start_time  | datetime    | NO |  | NULL |    | 
| end_time  | datetime    | NO |  | NULL |    | 
| title   | varchar(60)    | NO |  | NULL |    | 
| description | varchar(1000)   | NO |  | NULL |    | 
| user_id  | int(11)     | NO |  | NULL |    | 
| winner_user_id | int(10) unsigned  | YES |  | NULL |    | 
| type   | enum('fixed','auction') | YES |  | NULL |    | 
| budget   | decimal(10,0)   | YES |  | NULL |    | 
+----------------+-------------------------+------+-----+---------+----------------+ 

Bây giờ tôi đang cố gắng truy vấn thông tin về dự án và dữ liệu về cả hai người dùng.

Vì vậy, tôi đã đưa ra một truy vấn như

SELECT projects.project_id, projects.title, projects.start_time, 
      projects.description, projects.user_id, projects.winner_user_id, 
      users.username as owner, users.username as winner 
     FROM projects,users 
     WHERE projects.user_id=users.user_id 
     AND projects.winner_user_id=users.user_id 

nào trả về một tập rỗng rõ ràng. Vấn đề thực sự là làm thế nào để tôi tham khảo các user_ids khác nhau này. Tôi thậm chí đã thử sử dụng các từ khóa AS và sau đó sử dụng tên tôi đã tạo ra trong cùng một truy vấn sql nhưng dường như không hoạt động.

Để làm cho mọi việc rõ ràng cuối cùng tôi muốn một cái gì đó giống như

+------------+-------------------------------------------------+---------------------+---------+----------------+--------------+--------------+ 
| project_id | title           | start_time   | user_id | winner_user_id | owner  | winner  | 
+------------+-------------------------------------------------+---------------------+---------+----------------+--------------+--------------+ 
|   1 | CSS HTML Tableless expert for site redesign  | 2009-09-01 21:07:26 |  1 |    3 | mr X  | mr Y  | 
|   2 | High Quality Ecommerce 3-Page Design HTML & CSS | 2009-09-01 21:10:04 |  1 |    0 | mr X  | mr Z  | 

Làm thế nào tôi có thể xây dựng một truy vấn để xử lý này?

Xin cảm ơn trước.

Trả lời

8

Bạn đang ở gần, nhưng bạn cần tham gia bảng người dùng hai lần, một lần về chủ sở hữu và một lần với người chiến thắng. Sử dụng bí danh bảng để phân biệt hai.

SELECT 
     projects.project_id 
    , projects.title 
    , projects.start_time 
    , projects.description 
    , projects.user_id 
    , projects.winner_user_id 
    , users.username as owner 
    , winnerUser.username as winner 
FROM projects 
INNER 
    JOIN users 
    ON projects.user_id=users.user_id 
INNER 
    JOIN users winnerUser 
    ON projects.winner_user_id=winnerUser.user_id 
+0

Cảm ơn rất nhiều! Tôi không bao giờ thực sự sử dụng cú pháp INNER JOIN nhưng tôi thấy nó thú vị là winnerUser không được chỉ định trực tiếp sau FROM. – zenna

2
SELECT ... FROM users AS winers, users AS owners 
WHERE projects.user_id=owners.user_id 
     AND projects.winner_user_id=winners.user_id 
1

gì về việc sử dụng một cái gì đó như thế này:

SELECT projects.project_id, projects.title, projects.start_time, 
    projects.description, projects.user_id, projects.winner_user_id, 
    user_owner.username as owner, user_winner.username as winner 
FROM projects 
    inner join users user_owner on user_owner.user_id = projects.user_id 
    inner join users user_winner on user_winner.user_id = projects.winner_user_id 

Trước tiên, bạn có dự án, sau đó bạn bên tham gia về chủ sở hữu (sử dụng một bí danh cụ thể), và sau đó bên tham gia trên người chiến thắng (sử dụng bí danh cụ thể khác).

Và, trong mệnh đề lựa chọn, bạn sử dụng các bí danh đó để lấy thông tin bạn muốn - giống nhau nếu bạn cần hạn chế bất cứ điều gì trong mệnh đề where, btw.

Lưu ý: nếu bạn cũng muốn các dự án chưa có chiến thắng, bạn có thể muốn sử dụng phép nối trái thay vì bên trong.

0
SELECT u1.user_id AS user_id, u2.user_id AS AS winner_id 
FROM projects p 
    INNER JOIN users u1 ON p.user_id=u1.user_id 
    INNER JOIN users u2 ON p.winner_user_id=u2.user_id 
0

này nên làm việc, và trở về NULL nếu là người chiến thắng trong vô danh (khi winner_user_id là null)

SELECT projects.project_id, 
    projects.title, 
    projects.start_time, 
    projects.description, 
    projects.user_id, 
    projects.winner_user_id, 
users_owner.username as owner, 
users_winner.username as winner 
FROM projects 
    INNER JOIN users AS users_owner ON users_owner.user_id = projects.user_id 
    LEFT OUTER JOIN users AS users_winner ON users_winner.user_id = projects.winner_user_id 
Các vấn đề liên quan