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

时间:2012-03-13 22:23:27

标签: 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在任一个表上,我应该得到一次名称,因为它存在于两个表中。

我仍然从第一张桌子获得一排,从第二张桌子获得第二排。有什么问题?

任何帮助表示感谢。

6 个答案:

答案 0 :(得分:14)

您的SQL存在两个问题:

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

  2. 您获得两行的原因是UNION DISTINCT只会抑制实际重复,因此元组(someuser,peter)和元组(someotheruser, peter)将导致重复。

  3. 修改

    要使(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
      ...
    

    因此,您只需选择已知的someuserpeter

答案 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) = ...

这与您在WHERE statement after a UNION in SQL?

中可以看到的答案相似

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

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