根据某些WHERE条件选择某些字段

时间:2010-12-14 03:48:50

标签: sql mysql

我正在编写一个高级MySQL查询,用于搜索数据库并检索用户信息。我想知道的是,如果符合WHERE条件1,我可以选择某些字段吗?如果满足条件2的条件,则选择其他字段?

数据库:用户

------------------------
| user_id | first_name |
------------------------
|    1    |    John    |
------------------------
|    2    |    Chris   |
------------------------
|    3    |     Sam    |
------------------------
|    4    |    Megan   |
------------------------

数据库:友谊

--------------------------------------
| user_id_one | user_id_two | status |
--------------------------------------
|      2      |      4      |    0   |
--------------------------------------
|      4      |      1      |    1   |
--------------------------------------

Status 0 = Unconfirmed
Status 1 = Confirmed

好的,你可以看到John&梅根是克里斯和肯尼亚的朋友。梅根是朋友,但这种关系未经证实。

我想写的查询如下:Megan(4)搜索新朋友我希望所有用户除了与她确认的朋友一起被退回。所以,结果应该返回2,3。但由于存在与user_id 2的关系但未确认,我还想返回状态,因为友谊表中的条目确实存在于两者之间。如果用户存在但关系表中没有连接,它仍会返回该用户信息,但返回状态为NULL或根本不返回状态,因为该表中不存在。

我希望这是因为。如果需要,可以提出问题。

2 个答案:

答案 0 :(得分:1)

为什么不使用左连接或if-not-exists?

SELECT users.* 
FROM (users LEFT JOIN friendships 
       ON status=1 AND (user_id_one=user_id OR user_id_two=user_id) )
WHERE 
     status IS NULL

SELECT users.* 
FROM users
WHERE 
NOT EXISTS (SELECT * 
            FROM friendships 
            WHERE status=1 
            AND (user_id_one=user_id 
                 OR user_id_two=user_id))

答案 1 :(得分:0)

您可以创建单独的查询,然后UNION结果表。在每个查询中,添加始终具有相同值的字段。

所以这样的事情应该有效:

(SELECT id, 'Not Friends' As Status FROM t1 WHERE condition1)
UNION
(SELECT id, 'Unconfirmed' As Status FROM t1 WHERE condition2)

确保两个查询中都存在相同的字段数和名称。