我在下面有一个查询,我正在使用 IF 语句,但它不起作用。
"SELECT * FROM chat,user WHERE
IF(chat.seller_id='".$user_id."') THEN user.id=chat.buyer_id
ELSE IF(chat.buyer_id='".$user_id."') THEN user.id=chat.seller_id"
尝试改用 CASE:
SELECT * FROM chat,user WHERE
CASE
WHEN chat.seller_id='".$user_id."' THEN user.id=chat.buyer_id
WHEN chat.buyer_id='".$user_id."' THEN user.id=chat.seller_id
ELSE user.id='something'
END
另一种是,如果您有任何不是卖家或买家的用户 ID
你应该试试这个:
SELECT * FROM chat,user WHERE user.id = CASE
WHEN chat.seller_id='".$user_id."' THEN chat.buyer_id
WHEN chat.buyer_id='".$user_id."' THEN chat.seller_id
ELSE user.id='something'
END
这在功能上不是与
:"SELECT *
FROM chat c,user u
WHERE (c.seller_id = u.id AND c.buyer_id = ".$user_id.")
OR (c.buyer_id = u.id AND c.seller_id = ".$user_id.")"
查询的逻辑也可以通过UNION
来完成:
"
SELECT *
FROM chat
JOIN user
ON user.id = chat.buyer_id
WHERE chat.seller_id = '".$user_id."'
UNION
SELECT *
FROM chat
JOIN user
ON user.id = chat.seller_id
WHERE chat.buyer_id = '".$user_id."'
";
您应该测试UNION
与CASE
,看看哪个更快。请注意,即使您的CASE
查询有效,您仍然可能会在旧版本的 phpMyAdmin 中测试它时遇到错误,因为解析器在CASE
语句方面存在问题。
如果您只需要特定$user_id
购买或出售的其他用户的列表,则可能需要考虑仅查询user.*
,甚至仅查询特定user
列。两个表上的SELECT *
让我认为您想为$user_id
提取聊天记录,但您还应该意识到,您在此处的逻辑可能会抓取从$user_id
购买或出售给但不一定与$user_id
一起使用的用户的聊天。下面是一个示例表:
chat_id buyer_id seller_id
1 4 6
2 2 6
3 4 9
4 6 4
5 1 4
6 6 5
7 9 2
8 2 4
如果seller = 4
,则buyer_id = [1,2,6] => chat_id [2,4,5,6,8]
如果buyer = 4
,则seller_id = [6,9] => chat_id [1,2,3]
您的结果将包括[1,2,3,4,5,6,8]
,即使用户 4 只是[1,3,4,5,8]
的一部分
如果你只想要$user_id
聊天,那么你可以使用类似的东西
SELECT *
FROM chat c
JOIN user u
ON (
c.seller_id = u.id
OR c.buyer_id = u.id
)
WHERE u.id = $user_id
此外,由于您是字符串连接查询,请阅读并学习使用 PDO 和参数化查询来保护自己免受 SQL 注入攻击。