Mysql 在一个更新查询中更新三个表
我有三张这样的桌子:Mysql 在一个更新查询中更新三个表,mysql,Mysql,我有三张这样的桌子: $subject = $_POST['subject']; $cat_name = $_POST['cat_name']; $body = $_POST['body']; 1/主题表: 2/类别表: 主题表通过外键category\u id链接到categories表 3/物品表: 文章表通过外键topic\u id链接到topics表。此表存储主题的描述(文章id#1)及其可能的回复(文章id#2) 我有一个表单,使主题所有者能够更新表1中的主题、表2中的类别名称、表3
$subject = $_POST['subject'];
$cat_name = $_POST['cat_name'];
$body = $_POST['body'];
1/主题表:
2/类别表:
主题表通过外键category\u id
链接到categories表
3/物品表:
文章表通过外键topic\u id
链接到topics表。此表存储主题的描述(文章id#1
)及其可能的回复(文章id#2
)
我有一个表单,使主题所有者能够更新表1中的主题
、表2中的类别名称
、表3中的正文
假设我可以成功验证主题、类别名称和正文等三个必需元素,并且我已从表单提交中获取它们,并将其分配给以下三个变量:
$subject = $_POST['subject'];
$cat_name = $_POST['cat_name'];
$body = $_POST['body'];
现在,我想更新主题id#1
($tid=$\u GET['tid'];
),它的主题、类别名称和主体存储在三个不同的表中
你能帮我写一个能满足这个要求的更新查询吗
多谢各位
p/S:我只能为一个表编写更新查询。现在,我陷入了多表更新
查询
[编辑]:为了帮助澄清这个问题,我想补充一条信息如下:
由于更新
是由主题的所有者执行的(非所有者无法执行),因此此处的文章id#2
可能/可能不属于特定主题id
的同一所有者/用户。因此,请考虑<<代码>更新>代码>进程,只关注“强”>“最先< /强>与要更新的Popic ID。”< /P> < P> MySQL遵循以下一般格式:
UPDATE
t1
JOIN t2 ON t1.id = t2.t1_id
SET
t1.col1 = 'new value',
t2.col2 = 'new value'
WHERE
<some condition>
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准备的语句(推荐)。根据需要替换新值
关于这些日期格式的说明2014年7月22日
。。。除非这只是您在问题中键入的示例数据,否则它表明您可能没有在该列中使用。建议使用DATE
类型,以允许MySQL使用其内置的日期处理功能。我猜这是MySQL?RDBMS之间的更新连接语法不同。这似乎是一个糟糕的数据库设计。主题应该是文章表中的一列。然后,类别和主题应使用分层结构来“归档”文章。然后,您可以只更新文章表以更改主题、正文和类别/主题归档。虽然m/dd/yyyy日期格式建议可能使用MS SQL Server(如果是mysql,则应将其转换为适当的日期时间类型,而不是varchar类型)@MichaelBerkowski:是的,您是对的!。这是我的MySQL。@MichaelBerkowski:是的。我会改正的。我会使用date-datetime-NOT-NULL,
。您能帮我进行更新查询吗?谢谢您的快速回答。我会很快使用它并给你反馈。顺便说一下,我对articles
表使用DATETIME类型。好吗?注意:我正在使用MySQLi
进行编码过程,因为像我这样的新手仍然可以使用PDO-prepared-statement
。@Eric\u ph是的,DATETIME可以。当我看到您在这里表示的格式时,我很担心,因为这通常意味着使用varchar列。(现在是开始掌握预处理语句的窍门的时候了——它们在安全性方面有很大的不同,在我看来,对于预处理语句,PDO比MySQLi更容易使用)我刚刚测试了这个。太棒了@埃里克:嘿,我很高兴听到它成功了。很乐意帮忙,祝你好运。
UPDATE
t1
JOIN t2 ON t1.id = t2.t1_id
SET
t1.col1 = 'new value',
t2.col2 = 'new value'
WHERE
<some condition>
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 = ?