mysql查询两张表,UNION和where子句

标签 mysql sql union where-clause

我有两个表。

我这样查询:

SELECT * FROM (
   Select requester_name,receiver_name from poem_authors_follow_requests  as one 
UNION 
Select requester_name,receiver_name from poem_authors_friend_requests as two 
) as u 
where (LOWER(requester_name)=LOWER('user1') or LOWER(receiver_name)=LOWER('user1'))

我正在使用 UNION,因为如果用户存在于第一个表和第二个表中,我想为每个用户获取不同的值。

例如:

table1

nameofuser
peter

table2

nameofuser
peter

如果 peter 在任何一张 table 上,我应该得到一次名字,因为它存在于两张 table 上。

我仍然从第一个表中得到一行,从第二个表中得到第二行。怎么了?

感谢任何帮助。

最佳答案

你的 SQL 有两个问题:

  1. (这不是问题,但应该考虑)通过在 UNION 而不是表格上使用 WHERE,你创造了一个性能噩梦:MySQL 将创建一个包含 UNION 的临时表,然后通过 WHERE 查询它。在字段 (LOWER(requester_name)) 上使用计算会使情况变得更糟。

  2. 你得到两行的原因是,UNION DISTINCT 只会抑制真正的重复项,所以元组 (someuser,peter) 和元组 (someotheruser, peter) 将导致重复。

编辑

要使 (someuser, peter) 成为 (peter, someuser) 的副本,您可以使用:

SELECT
  IF(requester_name='peter', receiver_name, requester_name) AS otheruser
FROM
  ...
UNION
SELECT
  IF(requester_name='peter', receiver_name, requester_name) AS otheruser
FROM
  ...

所以你只选择你已经知道的 someuser : peter

关于mysql查询两张表,UNION和where子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693136/

相关文章:

java - 在ListView中显示JsonArray

php - 如何将mysql行存储到私有(private)数组变量中?

mysql - 双号ID

mysql - mysql中具有多个条件的完全外连接

sql - Oracle 将两行合并为一行

r - 根据匹配将数据添加到列

php - 是否可以使用 php 和 curl 在 mysql 中处理多个连接

sql - 两个表上的基于时间戳的连接

php - 如何计算与连接中另一行专门匹配的条目

mysql - 创建 View 连接两个具有相同列且没有重复的表