我有两张桌子。
我这样查询:
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在任一个表上,我应该得到一次名称,因为它存在于两个表中。
我仍然从第一张桌子获得一排,从第二张桌子获得第二排。有什么问题?
任何帮助表示感谢。
答案 0 :(得分:14)
您的SQL存在两个问题:
(这是不问题,但应该考虑)使用WHERE
而非UNION
代替表格,您创建了一场性能噩梦: MySQL将创建一个包含UNION
的临时表,然后通过WHERE
进行查询。在字段(LOWER(requester_name)
)上使用计算会使情况更糟。
您获得两行的原因是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
答案 1 :(得分:2)
你需要在上的where子句选择:
select requester_name, receiver_name
from poem_authors_follow_requests
where LOWER(requester_name) = LOWER('user1') or LOWER(receiver_name) = LOWER('user1')
union
select requester_name, receiver_name
from poem_authors_friend_requests
where LOWER(requester_name) = LOWER('user1') or LOWER(receiver_name) = LOWER('user1')
这两个查询彼此独立,因此除了union
之外,您不应尝试连接它们。
答案 2 :(得分:1)
如果要从多个表中逐个选择行,或者从单个表中选择几组行作为单个结果集,则可以使用UNION。 UNION从MySQL 4.0开始提供。本节说明如何使用它。 假设您有两个列出潜在客户和实际客户的表,第三个表列出了您从中购买耗材的供应商,并且您希望通过合并来自所有三个表的名称和地址来创建单个邮件列表。 UNION提供了一种方法。假设这三个表具有以下内容:
http://w3webtutorial.blogspot.com/2013/11/union-in-mysql.html
答案 3 :(得分:0)
您之前正在进行联合,然后应用where子句。因此,您将获得“requester_name,receiver_name”的唯一组合,然后将应用where子句。在每个选择中应用where子句......
Select requester_name,receiver_name from poem_authors_follow_requests
where (LOWER(requester_name)=LOWER('user1')
or LOWER(receiver_name)=LOWER('user1'))
UNION
Select requester_name,receiver_name from poem_authors_friend_requests
where (LOWER(requester_name)=LOWER('user1')
or LOWER(receiver_name)=LOWER('user1'))
答案 4 :(得分:0)
在where语句中,在where语句中引用每个字段refence的别名“u”。
所以where语句的开头就像:where (LOWER(u.requester_name) = ...
答案 5 :(得分:-1)
您应该可以使用INTERSECT
关键字,而不是在UNION
上执行嵌套查询。
SELECT member_id, name FROM a
INTERSECT
SELECT member_id, name FROM b
可以简单地重写为
SELECT a.member_id, a.name
FROM a INNER JOIN b
USING (member_id, name)