2009-09-12 2 views
5

私は、ユーザーのための2つの外部キー(user_idとwinner_user_id)を持っているプロジェクトテーブルを持っています.1つはプロジェクトの所有者、もう1つはプロジェクトの勝者です。何かのようにSQL、テーブル内の複数の外部キーを使用してクエリを実行するにはどうすればよいですか?

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

私は両方のユーザーについてのプロジェクトとデータに関する情報を得るために単一のクエリで試しています。

だから私は明らかに空のセットを返します

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 

ようなクエリを策定しました。実際の問題は、これらの異なるuser_idをどのように参照するかです。私はASキーワードを使い、同じSQLクエリで作成した名前を使用しようとしましたが、明らかに動作しません。最後に、物事を明確にする

私はどのように私はこれを処理するクエリを作成することができます

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

のようなものをご希望ですか?

ありがとうございます。

答えて

8

あなたは近くですが、オーナーテーブルに1回、勝者に1回、ユーザーテーブルに2回参加する必要があります。テーブルエイリアスを使用して2つを区別します。その後、

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 

あなたが最初のプロジェクトを持っている、そしてあなたは、内側(ある特定の別名を使用して)、所有者に参加、およびインナー・ジョイン:

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

おかげでたくさんあればNULLを返す必要があります!私は本当にINNER JOIN構文を使用していることはありませんが、FROMの直後にwinnerUserが指定されていないというのは面白いことです。 – 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

このようなものを使用してについては何勝者に(別の別名を使用)

select句では、必要な情報を取得するためにこれらのエイリアスを使用します。where句で何かを制限する必要がある場合も同じです(btw)。

注:勝者がまだないプロジェクトも必要な場合は、インナーではなく、左ジョイントを使用することができます。

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

これは動作、および(winner_user_idが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 
関連する問題