-1

非常によく似た情報を含む 3 つのテーブルがあります。テーブルは、所有者、管理者、および従業員です。各レコードがどのテーブルから来たのかを理解しながら、3 つのテーブルすべてから情報を取得しようとしています。私も重複したくありません。すべてのテーブルには、参加しているテーブルに関連する email_id がありemailます。

また、email_id が複数のテーブルに存在する可能性が非常に高くなります (つまり、1 つの電子メールが所有者と管理者、または 3 つすべてである場合もあります)。

これが私がこれまでに持っているものです:

SELECT email
FROM (
    (
        SELECT e.email
        FROM `owners` as o
        LEFT JOIN `email` as e
        ON e.email_id = o.email_id
        WHERE o.company_id = 3
        GROUP BY e.email
    )
    UNION ALL
    (
        SELECT e.email
        FROM `managers` as m
        LEFT JOIN `email` as e
        ON e.email_id = m.email_id
        WHERE m.company_id = 3
        GROUP BY e.email
    )
    UNION ALL
    (
        SELECT e.email
        FROM `employees` as emp
        LEFT JOIN `email` as e
        ON e.email_id = emp.email_id
        WHERE v.company_id = 3
        GROUP BY e.email
    )
) as `people`
ORDER BY email ASC

このクエリは実際には完全に機能します。テーブルから重複を個別に削除しますが、複数のテーブルにまたがって保持します。それぞれがどのテーブルから来たのかを知る方法はまだありません。クエリを次のように変更しようとしました。

SELECT email, owner, manager, employee
FROM (
    (
        SELECT e.email, 'yes' as owner
        FROM `owners` as o
        LEFT JOIN `email` as e
        ON e.email_id = o.email_id
        WHERE o.company_id = 3
        GROUP BY e.email
    )
    UNION ALL
    (
        SELECT e.email, 'yes' as manager
        FROM `managers` as m
        LEFT JOIN `email` as e
        ON e.email_id = m.email_id
        WHERE m.company_id = 3
        GROUP BY e.email
    )
    UNION ALL
    (
        SELECT e.email, 'yes' as employee
        FROM `employees` as emp
        LEFT JOIN `email` as e
        ON e.email_id = emp.email_id
        WHERE v.company_id = 3
        GROUP BY e.email
    )
) as `people`
ORDER BY email ASC

すべてのテーブルに同じ列があるわけではないため、これは機能しませんでした。すべてのフィールドをすべてのテーブルに追加すると (つまりSELECT e.email, 'yes' as owner, '' as manager, '' as employee)、クエリは機能しますが、すべてのテーブルに同じフィールドがあるように見えます。理由がわからない。

最終的に、返されたレコード セットに重複する電子メール アドレスがないようにし、各レコードを次のようにしたいと考えていますemail = 'email address', owner = 'yes/no', manager = 'yes/no', employee = 'yes/no'

これを達成する方法についてのアイデアはありますか? さらに情報が必要な場合は、コメントしてください。ありがとう!

4

3 に答える 3

0

このように各行に値を強制することでそれを行うことができます:

select t1.field1, t1.field2, 'YourFirstTable' as fromTable from t1
union all
select t2.field1, t2.field2, 'YourSecondTable' from t2

結果セット全体から重複を削除する場合 (「重複を削除する」ことで、任意のテーブルからのメールが必要になることを理解しています)、それを外側のクエリでラップし、次の方法でグループを適用する必要があります。

select field1, field2, max(fromTable)
    select t1.field1 as field1, t1.field2 as field2, 'YourFirstTable' as fromTable from t1
    union all
    select t2.field1, t2.field2, 'YourSecondTable' from t2
group by field1, field2
于 2013-10-24T16:06:19.900 に答える
0
        SELECT e.email,"owners" AS people
        FROM `owners` as o
        LEFT JOIN `email` as e
        ON e.email_id = o.email_id
        WHERE o.company_id = 3
        GROUP BY e.email
     UNION ALL
        SELECT e.email,"managers" AS people
        FROM `managers` as m
        LEFT JOIN `email` as e
        ON e.email_id = m.email_id
        WHERE m.company_id = 3
        GROUP BY e.email
    UNION ALL
        SELECT e.email,"employees" AS people
        FROM `employees` as emp
        LEFT JOIN `email` as e
        ON e.email_id = emp.email_id
        WHERE v.company_id = 3
        GROUP BY e.email;
于 2013-10-24T16:12:01.190 に答える