根据具有MYSQL的另一个表中的现有条目添加条目

时间:2016-12-21 15:45:58

标签: mysql sql

我有两个表(X和Y)和E-Mail列(列名:表x中的EmailX和表y中的EMailY)。我想在表X中添加一个列,其中填充了" yes"当表X中的电子邮件地址是表Y中的电子邮件地址之一时,"否"表X中的电子邮件地址不是表Y中的电子邮件地址之一。

我该怎么做?

感谢您的支持!

3 个答案:

答案 0 :(得分:0)

添加名为“status”的列或其他内容。

将它们全部设为否。

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

然后

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


commit; 

希望这会有所帮助。

答案 1 :(得分: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     toto@toto.com     yes       ...
2     tata@tata.com     no        ...
3     titi@titi.com     no        ...
4     ...

但是,也许你可以把问题逆转! 在表X中进行SELECT时,询问数据库会更简单。

例如结果中带有“是/否”:

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表在大表上执行时速度较慢。

答案 2 :(得分: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;

如果电子邮件在y中已经是唯一的,您可以直接从表中选择(left join y on y.emaily = x.emailx而不是。

这是个人选择的问题。我经常使用IN,在EXISTS<的条件下使用>,并在我需要来自另一个表的多个字段时使用联接。