【问题标题】:Default MySQL value to be result of a query默认 MySQL 值是查询的结果
【发布时间】:2016-04-18 14:57:19
【问题描述】:

是否可以将列的默认值作为查询结果,从而在查询值时自动更新值?

我有一个带有成员和取消表的数据库,我希望 members.NumberOfCancellations 值自动填充为以下伪查询的结果:

从cancellations.date 少于今天31 天且cancellations.memberid 等于$phpvariable 的取消中选择所有

我知道这可以通过 php 和选择/更新脚本来完成,但我希望 phpmyadmin 可能有这个功能?

______________________________________________________________
|memberid  |   firstname  | lastname  | numberofcancellations|
______________________________________________________________
|1         |   john       | doe       | resultofquery(= 2)   |  
|2         |  Dave        | Smith     | resultofquery (=1)   |
______________________________________________________________

___________________________________
|id    |memberid  |   date    | time  | group |
___________________________________
|1     |1         |2016-04-19 | 08:00 | 1     |
|2     |2         |2016-04-18 | 13:00 | 4     |
|3     |1         |2016-04-15 | 18:00 | 3     |
_______________________________________________

【问题讨论】:

  • 您能否包含一些示例输入和输出以在描述中添加面孔?
  • 没有。将其包含在您的问题中,格式为表格。

标签: mysql auto-update


【解决方案1】:

如果您的 members 表还没有取消计数的列,则添加它:

ALTER TABLE members ADD numberofcancellations int AFTER lastname;

现在您可以使用取消计数更新members

UPDATE members t1 LEFT JOIN
(
    SELECT memberid, COUNT(*) AS numberofcancellations
    FROM cancellations
    WHERE date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()
    GROUP BY memberid
) t2
   ON t1.memberid = t2.memberid
SET t1.numberofcancellations = COALESCE(t2.numberofcancellations, 0)

您将需要运行一次此查询以最初填充新列。如果要更新单个成员,则可以在UPDATE 语句中添加WHERE 条件:

UPDATE members t1 LEFT JOIN
(
    SELECT memberid, COUNT(*) AS numberofcancellations
    FROM cancellations
    WHERE date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()
    GROUP BY memberid
) t2
   ON t1.memberid = t2.memberid
SET t1.numberofcancellations = COALESCE(t2.numberofcancellations, 0)
WHERE t1.memberid = 1   -- or whatever value you want

【讨论】:

  • 有没有办法让更新查询即时运行(每当从其他查询中查询该列时)或每隔 x 时间运行一次?
  • 是的,您可以创建一个触发器来执行此操作。但我不会进一步补充我的答案。请为此提出另一个问题。
  • 感谢您提供的答案,但是我的问题是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2020-01-21
相关资源
最近更新 更多