web-dev-qa-db-ja.com

mysqlは、UNIONとwhere句の2つのテーブルをクエリします。

テーブルが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行目を取得します。なにが問題ですか?

助けてくれてありがとう。

8
stefanosn

SQLには2つの問題があります。

  1. (これはnot質問ですが、考慮する必要があります)テーブルの代わりにWHEREUNIONで使用すると、パフォーマンスの悪夢が発生します。MySQLはUNIONを含む一時テーブル、次にWHEREに対してクエリを実行します。フィールド(LOWER(requester_name))で計算を使用すると、これはさらに悪化します。

  2. 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

14
Eugen Rieck

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以外の方法で接続しないでください。

2
Bohemian

複数のテーブルから行を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'))
0
amit_g

Whereステートメントで、whereステートメントのフィールド参照ごとにエイリアス "u"を参照します。

したがって、whereステートメントの始まりは次のようになります:where (LOWER(u.requester_name) = ...

これは、次のような答えに似ています。 SQLのUNIONの後のWHEREステートメント?

0
James Oravec