我有两个表(X和Y)和E-Mail列(列名:表x中的EmailX和表y中的EMailY)。我想在表X中添加一个列,其中填充了" yes"当表X中的电子邮件地址是表Y中的电子邮件地址之一时,"否"表X中的电子邮件地址不是表Y中的电子邮件地址之一。
我该怎么做?
感谢您的支持!
答案 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
和<
的条件下使用>
,并在我需要来自另一个表的多个字段时使用联接。