如何删除联合表与联接表之间的匹配项

时间:2019-02-14 04:58:35

标签: mysql union matching metabase

我有2张桌子

电子邮件和字段

电子邮件只是电子邮件的列表,它们的唯一标识符和字段采用第五种普通形式(我认为),其中包含一列值(第二列中的ID数据),一个数据列以及链接到该列的ID第一个表中的uuid。

例如:

表1:

ID    EMAIL    
--    -----  
1a2  Test@Test   
2a3   email@email|
3a4   add@add    

表2:

value     Data        ID 
-----    ------       ---
 1       123 Main     1a2
 2      John Smith    1a2
 3         US         1a2  
 4     555-555-5555   1a2  

在这种情况下,表2仅显示“ 1a2”的数据,因为它们是唯一可以填写的数据。

因此,我正在尝试创建一个表格,该表格将电子邮件与相应的国家/地区代码相结合,并提供未将国家/地区代码注册为Null值的电子邮件

我尝试使用UNION在ID上连接表1和2之后显示表2中表1的所有电子邮件,然后使用where作为值,但这显示了所有具有正确国家代码的电子邮件,然后重复了它们也属于UNIONed部分。

这是我所得到的例子:

EMAIL        COUNTRY CODE
-----        ------------
test@test        US
test@test        NULL
email@email      NULL
add@add          NULL

您会注意到由于联合没有适当的过滤器,导致test @ test被重复

我的代码如下:

select
    e.email as "Email",
    f.value as "Country Code"
from
    email e
join
    fields f
    ON e.id = f.id
where
    f.value = '3'
    [[and f.data like concat({{CountryCode}},'%')]]   
    -- curly brackets are for user entered variables

无论如何,所有人都说完了。我正在寻找一个没有重复的类似这样的表

EMAIL        COUNTRY CODE
-----        ------------
test@test        US
email@email      NULL
add@add          NULL

4 个答案:

答案 0 :(得分:0)

您可以尝试使用max()聚合并按-进行分组

select
    e.email as "Email",
    max(f.value) as "Country Code"
from
    email e
left join
    fields f
    ON e.id = f.id
where
    f.value = '3'
    [[and f.data like concat({{CountryCode}},'%')]]   
group by  e.email

答案 1 :(得分:0)

您正在以键值格式存储用户元数据。这里的一种方法是将用户表与子查询左连接,该子查询可旋转以查找国家/地区:

SELECT
    e.EMAIL,
    f.country_code
FROM email e
LEFT JOIN
(
    SELECT ID, MAX(CASE WHEN value = 3 THEN Data END) AS country_code
    FROM fields
    GROUP BY ID
) f
    ON e.ID = f.ID;

enter image description here

Demo

答案 2 :(得分:0)

您可以使您感兴趣的字段成为LEFT JOIN条件的一部分。

SELECT
    e.EMAIL,
    f.data as countryCode
FROM email e
LEFT JOIN fields f ON f.value=3 AND e.ID=f.ID

具有该字段值的用户将返回它。没有用户,因为它是LEFT联接,所以他们将只是NULL。

如果要对fields值做条件,则还需要包括对null的检查。

SELECT
    e.EMAIL,
    f.data as countryCode
FROM email e
LEFT JOIN fields f ON f.value=3 AND e.ID=f.ID
WHERE
    f.data IS NULL 
    OR f.data='US'

答案 3 :(得分:0)

好吧,发布此帖子后我感到很傻,但是我找到了解决方案,并将其发布,以防其他人遇到问题。

left join
    fields f
    ON e.id = f.id
where
    f.value = '3' OR f.value is null
    [[and f.data like concat({{CountryCode}},'%')]]

我只需要为空值添加一个“或”。抱歉,如果我浪费任何人的时间,我显然会使事情变得过于复杂,并且在没有工会的情况下设法实现了我想做的事情。