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 = ?