テーブルが2つあります。
私はこのようにクエリします:
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'))
ユーザーが最初のテーブルと2番目のテーブルに存在する場合、ユーザーごとに異なる値を取得するため、UNIONを使用しています。
例えば:
table1
nameofuser
peter
table2
nameofuser
peter
peterがどちらかのテーブルにある場合、両方のテーブルに存在するので、名前を一度取得する必要があります。
それでも、最初のテーブルから1行、テーブル番号2から2行目を取得します。なにが問題ですか?
助けてくれてありがとう。
SQLには2つの問題があります。
(これはnot質問ですが、考慮する必要があります)テーブルの代わりにWHERE
をUNION
で使用すると、パフォーマンスの悪夢が発生します。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
bothの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')
2つのクエリは相互に独立しているため、union
以外の方法で接続しないでください。
複数のテーブルから行を1つずつ、または単一のテーブルから複数の行セットをすべて1つの結果セットとして選択する場合は、UNIONを使用できます。 UNIONはMySQL 4.0以降で使用できます。このセクションでは、その使用方法を説明します。見込み客と実際の顧客をリストする2つのテーブルがあり、3つ目はサプライ品を購入するベンダーをリストするテーブルで、3つすべてのテーブルの名前と住所をマージして単一のメーリングリストを作成するとします。 UNIONはこれを行う方法を提供します。 3つのテーブルに次の内容があると仮定します。
http://w3webtutorial.blogspot.com/2013/11/union-in-mysql.html
結合を行う前に、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'))
Whereステートメントで、whereステートメントのフィールド参照ごとにエイリアス "u"を参照します。
したがって、whereステートメントの始まりは次のようになります:where (LOWER(u.requester_name) = ...
これは、次のような答えに似ています。 SQLのUNIONの後のWHEREステートメント?