gpt4 book ai didi

mysql - 在一个 UPDATE 查询中更新三个表

转载 作者:行者123 更新时间:2023-11-29 00:10:23 24 4
gpt4 key购买 nike

我有三个这样的表:

1/主题表:

topic_id    category_id    subject    
1 1 first
2 3 second
3 2 third

2/类别表:

category_id    cat_name
1 art
2 math

topics 表通过外键 category_id 链接到 categories 表。

3/文章表:

article_id    topic_id    body      date
1 1 blabla 7/20/2014
2 1 a reply 7/22/2014

article 表通过外键 topic_id 链接到 topics 表。此表存储主题的描述 (article_id #1) 及其可能的回复 (article_id #2)

我有一个表单,使主题所有者能够更新表 1 中的主题、表 2 中的类别名称,以及 body 表3.

假设我可以验证三个必需的元素,例如subjectcat_namebody,我从表单提交中得到它们并分配给三个变量,如下所示:

$subject = $_POST['subject'];
$cat_name = $_POST['cat_name'];
$body = $_POST['body'];

现在,我想更新 topic_id #1 ($tid = $_GET['tid'];),其主题、类别名称和正文是存储在三个不同的表中。

你能帮我写一个可以执行这个要求的UPDATE查询吗?

非常感谢!

P/S: 我只能为一张表写更新查询。现在,我陷入了 multible-table update 查询。

[已编辑]:为了帮助澄清问题,我想添加一条信息如下:

由于 UPDATE 是由主题的所有者执行的(非所有者不能执行此操作),例如,此处的 article_id#2 可能/可能不属于特定 topic_id 的同一所有者/用户。所以请考虑 UPDATE 过程只关注 首先 与要更新的 topic_id 对应的 article_id。

最佳答案

MySQL 的 multi-table UPDATE syntax遵循一般格式:

UPDATE
t1
JOIN t2 ON t1.id = t2.t1_id
SET
t1.col1 = 'new value',
t2.col2 = 'new value'
WHERE
<some condition>

您需要通过 topic_id 加入以收集所有专栏以进行更新。在这里,复杂性主要在于数据模型在同一个表中列出文章和回复,只有它们在每个 article.topic_id 组中的位置来识别它们。这意味着您需要加入一个子查询,该子查询返回每个 topic_id 组的第一个 (MIN()) article_id 以确定哪篇文章的 body 应该更新。

UPDATE
topics t
INNER JOIN categories c ON t.category_id = c.category_id
INNER JOIN article a ON t.topic_id = a.topic_id
/**
Subquery retrieves the lowest article_id per topic_id
The INNER JOIN here will cause only one record from `article` to match
and be modified.
*/
INNER JOIN (
SELECT topic_id, MIN(article_id) AS article_id
FROM article
GROUP BY topic_id
/* Join the subquery against `article` by `article_id` */
) first_per_topic ON a.article_id = first_per_topic.article_id
SET
/* Supply the new values */
t.subject = ?,
c.cat_name = ?,
a.body = ?
WHERE
/* Identify the topic_id in the WHERE clause */
t.topic_id = ?

在上面,我使用了 ? 占位符假设一个 MySQLi 或 PDO 准备语句(推荐)。根据需要替换您的新值。

关于这些日期格式的注释 7/22/2014... 除非这只是您在问题中输入的示例数据,否则它表明您可能没有使用 a proper DATE data type在那个专栏上。建议使用 DATE 类型以允许 MySQL 使用其内置的日期处理能力。

关于mysql - 在一个 UPDATE 查询中更新三个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25408449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com