2

3番目のテーブルが別の2つに結合するクエリを考え出そうとしています。問題は、この最初のテーブルにさまざまなバージョンがあり、クエリでテーブル 1 の列を調べてから、結合する正しいテーブルを選択する必要があることですが、結果のクエリでは、テーブル 1 のすべての行を返す必要があり、追加のテーブル 3 を結合するだけです。 WHERE 句を満たす特定の行。 これは可能ですか?

例:

表 1 = ユーザー

表 2 = バナー

表 3 = UserSettings OR AdminSettings OR Nothing

クエリは次のようになります...

WHERE User.rank='admin' LEFT JOIN AdminSettings

WHERE User.rank='user' LEFT JOIN UserSettings

私の現在のクエリはこれです:

$query = "SELECT * FROM Users as U WHERE U.user_id = :id ";
$query .= "LEFT JOIN Banners as B ON U.banner_id = B.banner_id ";
$query .= "LEFT JOIN AdminSettings ON U.server_id = AdminSettings.user_id WHERE U.rank='Admin' ";
$query .= "LIMIT 1";

問題は、User.rank='admin' を持つ行のみが表示され、User.rank='user' が置かれている行が表示されないことです。

4

2 に答える 2

3

table32 回結合しCASE、select ステートメント内で使用する

SELECT  a.*,
        b.*
        CASE WHEN a.rank = 'admin' 
            THEN c.user_ID                     -- gets value from AdminSettings
            ELSE d.user_ID                     -- gets value from UserSettings
        END as ColName1,
        CASE WHEN a.rank = 'admin' 
            THEN c.colName                     -- gets value from AdminSettings
            ELSE d.colName                     -- gets value from UserSettings
        END as ColName2
FROM    users a
        INNER JOIN banners b
            ON a.banner_id = b.banner_id
        LEFT JOIN  AdminSettings c
            ON a.server_ID = c.user_ID
        LEFT JOIN UserSettings d
            ON a.server_ID = d.user_ID
于 2012-11-01T01:38:50.740 に答える
2

次のように、フィールド リストで IF 句を使用してみてください。

$query = "SELECT field1, field2, field3, IF(User.rank = 'admin', A.field, B.field)";
$query .= " FROM Users as U";
$query .= " LEFT JOIN Banners as B ON U.banner_id = B.banner_id";
$query .= " LEFT JOIN AdminSettings as A ON U.server_id = A.user_id";
$query .= " LIMIT 1";

そのような何かがうまくいくはずです。

于 2012-11-01T01:46:04.530 に答える