我试图减少我的应用程序用来构建 Jmeter 板的查询数量,因此我试图将我需要的所有信息提前收集到一个表中。大多数 Jmeter 板都可以使用json在javascript中构建,这将减少服务器的负载,而这将导致大量的php foreach查询。
考虑到这一点,我有一个查询,它将来自其他3个表的用户信息汇总在一起,并将结果按族连接到json group中。我需要在3个表中的任何一个发生更改时随时更新json对象,但不确定这样做的“正确”方式是什么。
我可以设置一个常规作业来执行更新语句,其中日期比上一次更新的日期要新,但这样会丢失新记录,如果插入,则会丢失更新。我可以删除并重新生成表,但作为一个整体运行查询大约需要16秒,所以这似乎不是正确的答案。
以下是我的初步查询:
SET group_concat_max_len = 100000;
SELECT family_id, REPLACE(REPLACE(REPLACE(CONCAT("[", GROUP_CONCAT(family), "]"), "\\", ""), '"[', '['), ']"', ']') as family_members
FROM (
SELECT family_id,
JSON_OBJECT(
"customer_id", c.id,
"family_id", c.family_id,
"first_name", first_name,
"last_name", last_name,
"balance_0_30", pa.balance_0_30,
"balance_31_60", pa.balance_31_60,
"balance_61_90", pa.balance_61_90,
"balance_over_90", pa.balance_over_90,
"account_balance", pa.account_balance,
"lifetime_value", pa.lifetime_value,
"orders", CONCAT("[", past_orders, "]")
) AS family
FROM
customers AS c
LEFT JOIN accounting AS pa ON c.id = pa.customer_id
LEFT JOIN (
SELECT patient_id,
GROUP_CONCAT(
JSON_OBJECT(
"id", id,
"item", item,
"price", price,
"date_ordered", date_ordered
)
) as past_orders
FROM orders
WHERE date_ordered < NOW()
GROUP BY customer_id
) AS r ON r.customer_id = c.id
where c.user_id = 1
) AS results
GROUP BY family_id
我简单地研究了一下触发器,但我所希望的是:
create TRIGGER UPDATE_FROM_ORDERS
AFTER INSERT OR UPDATE
ON orders
(EXECUTE QUERY FROM ABOVE WHERE family_id = orders.family_id)
我希望为每个表创建类似的内容,但乍一看,您似乎无法运行复杂的查询,例如我们正在创建嵌套json的查询。
我错了吗?触发器是正确的方法,还是有更好的方法?
1条答案
按热度按时间2eafrhcq1#
作为示范:
笔记:
mysql触发器是行级触发器;为受触发语句影响的“for each row”触发触发器。mysql不支持语句级触发器。
引用
NEW.family_id
是对family_id
刚刚更新的行的列,触发触发器的行。mysql触发器禁止触发器中的sql语句修改
orders
table。但它可以修改其他表。触发器主体中的sql语句可以是任意复杂的,只要它不是返回结果集的纯select或dml insert/update/delete语句。在mysql触发器中不允许使用ddl语句(如果不是全部的话,则大多数)。