web-dev-qa-db-ja.com

MYSQLは2つの異なるテーブルからデータを選択しますが、複数の行でデータを表します

1つのクエリで2つの異なるテーブルからすべての電子メールアドレスを選択する必要があります。この目標は、クライアントが行ごとに持っているすべての電子メールアドレスを一覧表示することです。

両方のテーブルの構造は互いに異なります。

表1構造

ID    First Name    Last Name    Email
1     Mike          Smith        [email protected]
2     Jane          Doe          [email protected]

表2構造

ID    Name             Value
1     work_email       [email protected]
1     alt_work_email   [email protected]
2     school_email     [email protected]
2     address 1        123 west main street
2     city             Houston

通常、表2の正確な名前がわかっている場合は、LEFT JOINを実行してゴールデンになりますが、そうではありません。

SELECT 
tb1.id, 
tb1.first_name, 
tb1.last_name, 
tb1.email as Value,
tb2.value as Value2, 
FROM  table1 as tb1
LEFT JOIN table2 as tb2 ON tb2.name LIKE '%email%' AND tb2.value LIKE '%@%' 
AND tb2.value != '' AND tb2.client_id = tb1.id  

上記のクエリが不正確であることはわかっていますが、表1からすべての電子メールアドレスを収集し、NameにTable 2からのWord電子メールが含まれ、それらの電子メールを電子メールアドレスに関連付けられたName値とともに表示するには、このようなものが必要です。表1名前の値は、Eメールの列ヘッダーになります。必要なものの望ましい出力は上記のとおりです。

望ましい出力

ID    First Name    Last Name    Name           Value
1     Mike          Smith        Email          [email protected]
1     Mike          Smith        work_email     [email protected]
1     Mike          Smith        alt_work_email [email protected]
2     Jane          Doe          Email          [email protected]
2     Jane          Doe          school_email   [email protected]

これに関するどんな助けも素晴らしいと非常に高く評価されます!

1
megabyte
    SELECT id, First_Name, Last_Name, 'Email' Name, Email Value
    FROM table1
UNION ALL /* or UNION DISTINCT */
    SELECT tb1.id, tb1.First_Name, tb1.Last_Name, tb2.Name, tb2.Value, 
    FROM  table1 tb1
    LEFT JOIN table2 tb2 
        ON tb2.Name LIKE '%email%' 
       AND tb2.Value LIKE '%@%' 
       AND tb2.client_id = tb1.id  
/* ORDER BY 1 */

PS。 AND tb2.value != ''条件が過剰です。 falseの場合、AND tb2.Value LIKE '%@%'もfalseです。

1
Akina