2017-01-29 14 views
0

は、ここに私の現在のデータベース構造である:どのようにしてユーザーのテーブルから投票者の名前を取得できますか?

// users 
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | Jack | 
| 2 | Peter | 
| 3 | John | 
| 4 | Barman | 
| 5 | Ali | 
+----+--------+ 

// vote 
+----------+---------------+ 
| voter_id | owner_post_id | 
+----------+---------------+ 
| 2  | 3    | 
| 4  | 2    | 
| 1  | 1    | -- people can vote to its own posts 
| 5  | 2    | 
| 2  | 2    | 
| 3  | 2    | 
+----------+---------------+ 

そして、この予想される出力:は、一般結果内の1つの以上の行があるはず:

+---------+-----------+----------+------------+ 
| user_id | user_name | voter_id | voter_name | 
+---------+-----------+----------+------------+ 
| 2  | Peter  | 4  | Barman  | 
| 2  | Peter  | 5  | Ali  | 
| 2  | Peter  | 3  | John  | 
+---------+-----------+----------+------------+ 

注(ユーザ2用)このように:

| 2  | Peter  | 2  | Peter  | 

しかし、 user_idvoter_idが同じものを手に入れたいどうやってやるの?


私の現在のクエリは:

SELECT u.id, u.name, v.voter_id 
FROM users u 
INNER JOIN vote v 
ON u.id = v.owner_post_id 
WHERE u.id = 2 -- for user 2 
+1

ここで... ...はnullですか? – Strawberry

+1

'AND user_id!= voter_id'? – JJJ

+0

@Strawberry何ですか?私は有権者の名前を得るためにもう一つの '左参加 'が必要ですか? – stack

答えて

1

あなたは一回投票関係の各側面のために、usersテーブル二回に参加する必要があります。

SELECT t2.id AS user_id, 
     t2.name AS user_name, 
     t3.id AS voter_id, 
     t3.name AS voter_name 
FROM vote t1 
INNER JOIN users t2 
    ON t1.owner_post_id = t2.id 
INNER JOIN users t3 
    ON t1.voter_id = t3.id 
WHERE t1.owner_post_id = 2 AND 
     t1.voter_id <> t1.owner_post_id 
+0

ありがとうございました。 upvote – stack

+0

'WHERE t1.owner_post_id = 2 ...'についてあなたは確かですか?私はそれが 'WHERE t2.id = 2 AND ... 'でなければならないと思います。 – stack

+0

' vote'と 'users'の最初の結合はこのcondititionで行われています:' t1.owner_post_id = t2.id' ...そうチェックは同じように動作する必要があります。実際には、元の 'vote'テーブルのどの列を制限するために使用しているかを明確にしているので、私は自分のバージョンを好みます。 –

関連する問題