【问题标题】:Updating the count each time a variable appears in another table每次变量出现在另一个表中时更新计数
【发布时间】:2020-10-17 02:01:11
【问题描述】:

我有一个名为保持安全的下表,其中包含以下列:

标识 |电子邮件 |订单

id 和 email 列已填充。

然后我想通过 Wordpress postmeta 表并计算每次电子邮件地址出现在 meta_key 出现“_billing_email”的行中的时间,然后用每个电子邮件地址出现的次数更新保持安全表。

postmeta 表设置为:

meta_id | post_id |元密钥 |元值

我正在使用以下内容,但不断收到运行时错误(postmeta 表很大!),我哪里出错了?

update staysafe

set orders =
(select count(*) 
from wp_postmeta
where email = meta_value)

【问题讨论】:

  • 请标记一个 DBMS(Oracle、MySQL 等);这样,熟悉您的特定 SQL 方言的人就可以看到该问题。另外,请准确说明您遇到的错误。
  • @JoshEller 抱歉,现在更新了,由于表格太大,我遇到了运行时错误。在我的尝试中它没有考虑到“_billing_email”,所以这可能会有所帮助???

标签: mysql sql


【解决方案1】:

我相信你想要这个:

update staysafe s
set s.orders = (
  select count(*) 
  from wp_postmeta
  where meta_key = '_billing_email' and meta_value = s.email
)

这将更新表staysafe的所有行。
如果要更新特定行,请添加 WHERE 子句:

where s.email = 'someemail@aaa.com'

【讨论】:

  • 谢谢,这看起来可行,但我一直在超时,有没有办法解决它? '超过锁定等待超时时间;尝试重新启动事务错误代码 1205。'
  • wp_postmeta 表中 (meta_key, meta_value) 的复合索引将有助于加快进程。对于您遇到的超时错误,SO 中有几个问题/答案:stackoverflow.com/questions/5836623/…stackoverflow.com/questions/36547173/… 等。
【解决方案2】:

你可以聚合和join:

update staysafe s left join
       (select meta_value, count(*) as cnt
        from wp_postmeta
        where meta_key = '_billing_email'
        group by metavalue
       ) pm
       on s.email = pm.email
    set orders = coalesce(cnt, 0);

如果您不关心 0 值,请将 left join 更改为 inner join

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多