2012-03-13 28 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?