3

これらの4つのフィールドは互いに関連しています

友達-投稿-ユーザー-フィード

私はそれを次のように出力したい:ここに画像の説明を入力してください

私の質問では:

SELECT users.firstname, users.lastname, users.screenname, posts.post_id, posts.user_id,
posts.post, posts.upload_name, posts.post_type, 
DATE_FORMAT(posts.date_posted, '%M %d, %Y %r') AS date, 
COUNT(NULLIF(feeds.user_id, ?)) AS everybody, SUM(feeds.user_id = ?) AS you,
GROUP_CONCAT(CASE WHEN NOT likes.user_id = ? THEN 
             CONCAT_WS(' ', likes.firstname, likes.lastname)
                    END
            ) as names
FROM website.users users
INNER JOIN website.posts posts ON (users.user_id = posts.user_id)
LEFT  JOIN website.feeds feeds ON (posts.post_id = feeds.post_id)
LEFT  JOIN website.users likes ON (feeds.user_id = likes.user_id)
GROUP BY posts.pid
ORDER BY posts.pid DESC

現在、friendsテーブルに参加する必要がある部分に問題があります。friend_idまたはuser_idからのすべての投稿と、現在ログインしているユーザーからの投稿も表示したいと思います。friendテーブルに一致する友達がいない場合は、ユーザーからのすべての投稿を出力するだけです。皆さん、助けが必要です。

friends.friend_id=現在のユーザーの友達

friends.user_id=ユーザーの現在の友達

したがって、friends.friend_id=posts.user_idまたはfriends.user_id=posts.user_id

友達のテーブルが理解できない場合は、テーブルを改善するために変更するのを手伝ってください。

4

2 に答える 2

2

私がよく理解している場合は、friends = user_idに基づいてfriendsテーブルに参加し、そうでない場合は、friendsテーブルのuser_idのJOINと一致しないため、次のように試すことができます。

SELECT users.firstname, users.lastname, users.screenname, posts.post_id, posts.user_id,
posts.post, posts.upload_name, posts.post_type, 
DATE_FORMAT(posts.date_posted, '%M %d, %Y %r') AS date, 
COUNT(NULLIF(feeds.user_id, ?)) AS friends, SUM(feeds.user_id = ?) AS you,
GROUP_CONCAT(CASE WHEN NOT likes.user_id = ? THEN 
             CONCAT_WS(' ', likes.firstname, likes.lastname)
                    END
            ) as names
FROM website.users users
INNER JOIN website.posts posts ON (users.user_id = posts.user_id)
LEFT  JOIN website.feeds feeds ON (posts.post_id = feeds.post_id)
LEFT  JOIN website.users likes ON (feeds.user_id = likes.user_id)
LEFT  JOIN website.friends friends ON ((posts.user_id = friends.user_id) OR (posts.user_id = friends.friends_id) )
GROUP BY posts.pid
ORDER BY posts.pid DESC

私は基本的に、あなたが参加したいと思われる2つのフィールドにORを使用したJOINwithfriendsテーブルを追加しました...

于 2012-05-13T08:44:05.810 に答える
2

ユーザーまたは彼の友達からの投稿を見たいと思います。したがって、ユーザーと結合する代わりに、次のようにサブクエリと結合します。

SELECT users.firstname, users.lastname, users.screenname,
       posts.post_id, posts.user_id, posts.post, posts.upload_name,
       posts.post_type, DATE_FORMAT(posts.date_posted, '%M %d, %Y %r') AS date, 
       COUNT(NULLIF(feeds.user_id, ?)) AS everybody,
       SUM(feeds.user_id = ?) AS you,
       GROUP_CONCAT(CASE WHEN NOT likes.user_id = ? THEN 
             CONCAT_WS(' ', likes.firstname, likes.lastname) END) as names
  FROM (SELECT user_id FROM website.users WHERE user_id = ?
        UNION ALL
        SELECT user_id FROM website.friends WHERE friend_id = ?
        UNION ALL
        SELECT friend_id FROM website.friends WHERE user_id = ?) AS who
  JOIN website.users users ON users.user_id = who.user_id
  JOIN website.posts posts ON users.user_id = posts.user_id
  LEFT  JOIN website.feeds feeds ON posts.post_id = feeds.post_id
  LEFT  JOIN website.users likes ON feeds.user_id = likes.user_i)
 GROUP BY posts.pid
 ORDER BY posts.pid DESC;

ここで出力をテストします。

于 2012-05-13T09:36:26.607 に答える