2011-08-11 13 views
1

私は友人や特定のユーザーが投稿した最新の "ボード"エントリを選択するクエリを作成しようとしています。私が何かを投稿した場合、私がこのセクションを閲覧していれば、最新の6つのボードアイテムが表示されます。友人を得るために結合を使用したmysqlクエリ

クエリは次のとおりです。

SELECT b.id, b.user, b.title, b.text, b.time 
FROM board b 
JOIN user u ON u.user = b.user 
JOIN friend f ON f.friend_id = u.id 
WHERE f.user_id = 1 
ORDER BY `time` DESC 
LIMIT 0 , 6 

私は他の人にユーザーID、実際のユーザー名は、いくつかのテーブルで使用されたテーブルを扱っています。したがって、なぜ結合しますか。 上記のクエリは友だちからの最新の投稿をすべて取得しますが、作成したユーザーの投稿が必要です。 例えば:

SELECT b.id, b.user, b.title, b.text, b.time 
FROM board b 
JOIN user u ON u.user = b.user 
JOIN friend f ON f.friend_id = u.id 
WHERE f.user_id = 1 
OR b.user = 'the_users_name' 
ORDER BY `time` DESC 
LIMIT 0 , 6 

2番目のクエリは、単に参加によるユーザの6つの重複行を返します。 これを修正してユーザーの投稿や友だちの投稿を表示するにはどうすればよいですか?

答えて

2

私はトリックを行う必要がありますUNION ALLを使用して思う:

SELECT b.id, b.user, b.title, b.text, b.time 
FROM board b 
JOIN user u ON u.user = b.user 
JOIN friend f ON f.friend_id = u.id 
WHERE f.user_id = 1 
UNION ALL 
SELECT b.id, b.user, b.title, b.text, b.time 
FROM board b 
JOIN user u ON u.user = b.user 
WHERE u.user_id = 1 
ORDER BY time DESC 
LIMIT 0,6 

最初のクエリはあなたの友人のポストを与えるべきと第二はあなたのユーザーの投稿を与えるだろう。 UNION ALLは、これらの結果をまとめて組み合わせた結果、&の順番を組み合わせた結果に適用されます。

+0

ありがとうございました。決して組合を考えていない!私はそれを変更したので、2番目のクエリはユーザーからボードを選択するために "user"を使用しているため、ユーザーは参加しませんでした。select * from board where user = 'the_user_name' – rbruhn

0

は、UNIONを使用します。そのようなhttp://dev.mysql.com/doc/refman/5.0/en/union.html

SELECT b.id, b.user, b.title, b.text, b.time 
FROM board b 
JOIN user u ON u.user = b.user 
JOIN friend f ON f.friend_id = u.id 
WHERE f.user_id = 1 
UNION ALL 
SELECT b.id, b.user, b.title, b.text, b.time 
FROM board b 
JOIN user u ON u.user = b.user 
JOIN friend f ON f.friend_id = u.id 
WHERE f.user_id = 1 
OR b.user = 'the_users_name' 
ORDER BY `time` DESC 
LIMIT 0 , 6 

何か?

関連する問題