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

标签 mysql union matching metabase

我有两张 table

电子邮件和字段

emails 只是一个电子邮件列表,它们的唯一标识符和字段采用第五范式(我认为),其中有一列值(第二列中的 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

最佳答案

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

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

关于mysql - 如何删除联合表与连接表之间的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54683453/

相关文章:

php - 将某些表列导入到数据库表中

mysql - 提供额外的 bool 类型返回列,用于评估另一个查询

mysql - 如何在mysql中将这两个结果合并为一个?

enums - 如何传递枚举变体以作为函数参数进行匹配?

php - 如何从选择行有多个名称的所有行中获取每个名称一次

mysql - 从单个表中选择两个用户之间的所有共同项目

mysql - Linux 定制 Cron - 从 Mysql 运行 cron

MySQL通过UPDATE/DELETE合并重复数据记录

R:使用 MatchIt 进行倾向得分匹配。如何使用replace = TRUE查找匹配观察值的数量?

c# - 我可以在 C# 中将正则表达式与 String.Replace 一起使用吗?