我正在编写一个高级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或根本不返回状态,因为该表中不存在。
我希望这是因为。如果需要,可以提出问题。
答案 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)
确保两个查询中都存在相同的字段数和名称。