0

複数のSQLステートメントを1つの大きなステートメントに結合するのに問題があります。

問題: ニュースフィードがあり、ログインしたユーザーがフォローしているアカウントからすべての投稿を返す必要があります。また、ニュースフィードに投稿されたアカウントのユーザー名を取得するために、テーブルを他の2つのテーブルと結合する必要があります。このクエリで使用される4つのテーブルがあります。

フォロワー(フォローしているアカウントとフォローしているアカウントの種類を持つユーザーを一覧表示します)

重要な列:[user_id、following_id、type]

ユーザー(ユーザーは他のユーザーアカウントをフォローできます)

重要な列:[ユーザー名]

サーバー(ユーザーはサーバーアカウントをフォローすることもできます。ユーザーは自分のアカウントに関連付けられた0個以上のサーバーを作成できるため、ユーザーへのサーバーは1対多であることに注意してください)

重要なコラム:[タイトル]

News_Posts(これには、メッセージ、アカウントタイプ(整数)、およびposter_idが含まれます)

重要な列:[poster_id、message、type]

現在ログインしているユーザーのニュース投稿を取得する方法がわかりません。

クエリ1:「タイプ」に基づいて正しいユーザー名で完全なニュースリストを返します0 =ユーザー、1=サーバー

    SELECT news_posts.*, users.username FROM news_posts INNER JOIN users ON news_posts.poster_id=users.id WHERE news_posts.TYPE='0'

UNION

    SELECT news_posts.*, servers.title FROM news_posts INNER JOIN servers ON news_posts.poster_id=servers.id WHERE news_posts.TYPE='1'

クエリ2:特定のユーザー(この場合はID 1)がフォローしているアカウントを返します

    SELECT following_id, type FROM follower WHERE user_id='1'

クエリ1とクエリ2を組み合わせて、news_postのみがWHEREnews_posts.poster_id=クエリ2の結果を記録するようにするにはどうすればよいですか。正しいユーザー名が使用されるように、フォロワーのタイプを考慮する必要があります

編集:スキーマの大まかなバージョンは次のとおりです:http ://sqlfiddle.com/#!2 / a48f3 / 1

4

2 に答える 2

2

アカウント(ユーザーまたはサーバー)によって投稿され、その後にID1のユーザーが続くすべてのニュース投稿を要求しています。これらの投稿に関するすべての情報に加えて、投稿者のユーザー名またはサーバータイトルが必要です。これは、スキーマ(sqlfiddleでも)が与えられたSQLの場合です。

select p.*,
    account.username
from news_posts p
    join 
        (
            select id,
                username,
                0 as type
            from users
            union
            select id,
                title,
                1 as type
            from servers
        ) account
        on (
            account.id = p.poster_id
            and account.type = p.type
        )
    join follower f
        on (
            f.following_id = account.id
            and f.type = account.type
        )
where f.user_id = 1

これには、news_postsテーブルに2回ヒットしないという追加の利点があります。

于 2013-02-27T19:51:00.940 に答える
0

このような意味ですか?

SELECT * FROM
(
SELECT news_posts.*, users.username FROM news_posts INNER JOIN users ON news_posts.poster_id=users.id WHERE news_posts.type='0'
    UNION
SELECT news_posts.*, servers.title FROM news_posts INNER JOIN servers ON news_posts.poster_id=servers.id WHERE news_posts.type='1'
) un, Follower f
WHERE un.poster_id=f.following_id

変更されたフィドル:http ://sqlfiddle.com/#!2 / a48f3 / 3

これがあなたが探していたものではない場合は、要件を明確にしてください。

于 2013-02-27T19:42:39.417 に答える