2016-12-21 57 views
0

现有条目我有两个表(X和Y)与列电子邮件(:EmailX表x和EMailY在数据表Y列名)添加一个条目。当表X中的电子邮件地址是表Y中的电子邮件地址之一时,我希望在表X中添加填充了“是”的列,而当表X中的电子邮件地址不是电子邮件地址之一时的“否”在表Y.取决于另一个表MYSQL

我该怎么做?

感谢您的支持!

+0

请参阅左加入.. – Strawberry

+0

您不应该在表X中冗余地存储标志。您可以随时检查电子邮件是否存在于表Y中,在任何查询中都带有“IN”,“EXISTS”或甚至外连接。如果您不想在每个查询中都写这个,请为此创建一个视图。 –

+0

如何使用IN或EXISTS解决问题?你能给我写上面例子的代码吗? – AbsoluteBeginner

回答

0

不要将数据冗余存储在数据库中。由于您始终可以检查表y中是否存在条目,因此不应向表x添加标志来指示此情况。

这里是如何获得与EXISTS的信息:

select 
    x.*, 
    case when exists (select * from y where y.emaily = x.emailx) then 'yes' else 'no' end 
    as exists_in_y 
from x; 

同样与IN我喜欢的是简单的:

select 
    x.*, 
    case when emailx in (select emaily from y) then 'yes' else 'no' end as exists_in_y 
from x; 

与外部同样加入

select 
    x.*, 
    case when emaily is not null then 'yes' else 'no' end as exists_in_y 
from x 
left join (select distinct emaily from y) y on y.emaily = x.emailx; 

如果emaily在y中已经是唯一的,您可以选择直接表(left join y on y.emaily = x.emailx)。

这是一个个人选择什么偏好的问题。我去IN通常情况下,在使用条件下EXISTS<>,并使用时,我想从另一个表中的多个领域的加盟。

+0

CASE比IF解决方案更快吗? – Meloman

+0

这应该不会有所作为。 'CASE'是标准的SQL,'IF'不是。但是'IN' /'EXISTS'应该是最快的解决方案,通常当你想查找某些东西时。至少他们是最易读的:-) –

+0

问题在于他的速度。我们昨天谈到了。所以我finaly添加一个解决方案与PHP存储是/否在INSERT。但我同意你的意见,不存储数据是更好的。 – Meloman

0

添加一个名为“状态”,或什么的列。

将它们全部设置为no。

Update tableX set Status = "no" 
where 1=1; 

然后

Update tableX 
set Status = "Y" where emailX in (select emailY as emailX from tableY). 


commit; 

希望这有助于。

+0

如果在每次INSERT后执行,这将非常缓慢,而不是最佳选择。 – Meloman

+0

从我读到的,这将是一次演出不? –

+0

我没有读过,标题中写着“添加条目...”,但我的英语不是最好的,所以在这种情况下,您的解决方案是可以的。 – Meloman

0

这里是PHP的解决方案,在INSERT直接更新X表中的列 'INY':

$query = "INSERT INTO `X` (
       `emailX`, 
       `inY` 
     ) VALUES (
       '$email', 
       IF ((SELECT 
        COUNT(Y.emailY) 
        FROM Y 
        WHERE Y.emailY = '$email' 
        LIMIT 1 
      ) > 0,'yes','no') 
     )"; 

而结果将是:

id email    inY  ... 
1  [email protected]  yes  ... 
2  [email protected]  no  ... 
3  [email protected]  no  ... 
4  ... 

但是,也许你可以拿问题逆转了! 这将是simplier问你的数据库,当你做出一个选择表中的X.

例如用“是/否”的结果:

SELECT 
    X.id, 
    X.emailX AS email, 
    IF ((SELECT 
     COUNT(Y.emailY) 
     FROM Y 
     WHERE Y.emailY = X.emailX 
     LIMIT 1 
) > 0,'yes','no') AS inY 
FROM X 

取而代之的是/否,你甚至可以知道此查询中Y个表中存在多少次emailX:

SELECT 
    X.id, 
    X.emailX AS email, 
    (SELECT 
    COUNT(Y.emailY) 
    FROM Y 
    WHERE Y.emailY = X.emailX 
    LIMIT 1 
) AS inY 
FROM X 

SELECT解决方案在执行大表时速度较慢。

+0

我认为你的问题有一个错误:它不工作... – AbsoluteBeginner

+0

@AbsoluteBeginner我的IF()声明的开头括号是错误的地方,请让我们重试... – Meloman

+0

数据集是安静的大( X中大约300k行,Y中大约400k行):这样做需要很长时间......目前还没有完成:这是正常的吗? – AbsoluteBeginner