Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL检查A和B是否在(…)_Mysql_Sql_Select - Fatal编程技术网

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的目标。考虑到这一点,您是绝对正确的,应该不会有任何区别。:)