2012-03-13 72 views
7

我有两个表。mysql查询两个表,UNION和where子句

我这样的查询:

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 

如果彼得在两个表中的我应该得到的名字一个时间,因为它存在于两个表。

我还是从第一张桌上拿到一排,在第二张桌上拿到第二张。哪里不对?

任何帮助表示赞赏。

+0

在两个你的同时,表的列?也许在一个表中,列的类型为'char',而在另一个类型为'varchar'的类型中,可能会有一些空格... – 2012-03-13 22:28:07

+0

nop它们都是相同类型的字段 – stefanosn 2012-03-13 22:38:23

+0

在您的where语句中,您可能想要在每个字段之前引用“u”...因此'where(LOWER(u.requester_name)= ...'这与您可以在下面看到的答案类似:http://stackoverflow.com/questions/5452233/ where-statement-after-a-union-in-sql – 2014-04-07 22:15:31

回答

11

有两个问题与你的SQL:

  1. (这是的问题,而是应该考虑)通过在使用WHEREUNION而不是表格,你创建了一个性能噩梦: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

+0

感谢您告诉我Eugen Rieck您是对的它发现重复项为你说...你可以告诉我,如果有办法解决这个问题吗?(someuser,peter)或者(peter,someuser)应该是我的案例中的重复。 – stefanosn 2012-03-13 22:57:12

+0

编辑我的答案! – 2012-03-14 08:48:24

+0

非常感谢真正伟大的方法! – stefanosn 2012-03-14 16:49:29

-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) 

http://www.bitbybit.dk/carsten/blog/?p=71

+0

MySQL不支持'INTERSECT'关键字! – onedaywhen 2012-03-14 08:29:13

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') 

这两个查询是相互独立的,所以你不应该尝试连接t下摆不是由union

+0

我试过了,它仍然无法工作两次!!! – stefanosn 2012-03-13 22:36:19

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')) 
1

您可以使用UNION如果你想一个接一个地选择行f将单个表中的几个表或多组行组合为一个结果集。 UNION自MySQL 4.0开始提供。本节说明如何使用它。 假设您有两个列出潜在客户和实际客户的表格,第三个列出您购买耗材的供应商,并且您希望通过合并所有三个表格中的名称和地址来创建单个邮件列表。 UNION提供了一种方法来执行此操作。假设这三个表具有以下内容:

http://w3webtutorial.blogspot.com/2013/11/union-in-mysql.html

0

在你这里声明,引用的每个字段refence别名“U”在您的WHERE语句。

所以一开始你的WHERE语句会是这样:where (LOWER(u.requester_name) = ...

这是simlar你可以看到答案:WHERE statement after a UNION in SQL?