Mysql SQL检查A和B是否在(…)
我有一个消息系统,它使用以下列存储消息:Mysql SQL检查A和B是否在(…),mysql,sql,select,Mysql,Sql,Select,我有一个消息系统,它使用以下列存储消息: 消息,这是实际的消息 to_id,将接收消息的用户的id from_id,发送消息的用户的id 我想询问这样的对话: SELECT sender.username, message FROM messages JOIN users sender ON sender.id=messages.from_id JOIN users receiver ON receiver.id=messages.to_id WHERE (sender.username L
- 消息,这是实际的消息
- to_id,将接收消息的用户的id
- from_id,发送消息的用户的id
SELECT sender.username, message
FROM messages
JOIN users sender ON sender.id=messages.from_id
JOIN users receiver ON receiver.id=messages.to_id
WHERE (sender.username LIKE 'user1' AND receiver.username LIKE 'user2')
OR (receiver.username LIKE 'user1' AND sender.username LIKE 'user2')
这是可行的,但我只想传递user1和user2一次,比如
WHERE (from_id, to_id) IN ((SELECT id FROM users WHERE username LIKE 'user1'),
(SELECT id FROM users WHERE username LIKE 'user2'))
这在mysql中不起作用。有什么建议吗?您可以使用元组:
SELECT sender.username, message
FROM messages m JOIN
users sender
ON sender.id = m.from_id JOIN
users receiver
ON receiver.id = m.to_id
WHERE ('user1', 'user2') in ( (sender.username, receiver.username),
(receiver.username, sender.username),
);
从性能角度来看,这应该没有什么区别。您可以使用元组:
SELECT sender.username, message
FROM messages m JOIN
users sender
ON sender.id = m.from_id JOIN
users receiver
ON receiver.id = m.to_id
WHERE ('user1', 'user2') in ( (sender.username, receiver.username),
(receiver.username, sender.username),
);
从性能角度来看,这应该没有什么区别。除非你实际上不需要像
那样的,而是可以使用=
,否则我认为你原来的方法可能是最好的。除非你实际上不需要像那样的,而是可以使用=
,我认为你最初的方法可能是最好的。应该验证查询计划。从历史上看,这个构造导致了一个完整的表扫描,因为优化器不理解其含义,而且表达式的计算非常晚,使用where
@Michael sqlbot。原始代码还将导致全表扫描。避免这种情况需要重新编写查询以提高性能,而这不是OP的目标。考虑到这一点,您是绝对正确的,应该不会有任何区别。:)应验证查询计划。从历史上看,这个构造导致了一个完整的表扫描,因为优化器不理解它的含义,表达式的计算非常晚,使用where
@Michael sqlbot。原始代码还将导致全表扫描。避免这种情况需要重新编写查询以提高性能,而这不是OP的目标。考虑到这一点,您是绝对正确的,应该不会有任何区别。:)