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

加入table3两次并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 回答