【问题标题】:Use SELECT result to query another table's row使用 SELECT 结果查询另一个表的行
【发布时间】:2018-07-16 19:45:09
【问题描述】:

我有一个非常简单的 MySQL 查询要实现,但我不知道如何......

我有两张桌子,T1T2

我需要做什么:

T1,我根据 CODE 值检索 ID

SELECT id FROM T1 WHERE code = '$code';

然后我需要使用这个ID(所以我刚刚检索到的值)来更新T2中的特定行(行的名称将匹配ID 的值)。

我正在考虑使用子查询或用户定义的变量,但无论我如何尝试都无法完成。

如果您有任何代码 sn-p 可以帮助我做到这一点,我也将不胜感激!

编辑

澄清一下:我不知道我需要在 T2 中更新的列的名称,因为该名称将是我从 T1 检索到的值>.

例如,如果我从 T1 获得的 ID 是“03”,它将更新名为“”的列03”在 T2

编辑 2

这是我打算实现的一个小架构(希望我让自己更清楚,我很抱歉造成误解......)

【问题讨论】:

标签: mysql sql subquery


【解决方案1】:
UPDATE T2 SET COL = YOUR_VALUE
WHERE T2.ID = (SELECT id FROM T1 WHERE code = '$code')

UPDATE:如果子查询返回多于一行,则可以使用 from IN 运算符

UPDATE T2 SET COL = YOUR_VALUE
WHERE T2.ID IN (SELECT id FROM T1 WHERE code = '$code')

【讨论】:

  • 这仅适用于SELECT id FROM T1 WHERE code = '$code' 仅返回一行。
  • 是的。
【解决方案2】:

使用UPDATEJOIN

UPDATE T2
CROSS JOIN T1
SET T2.`0` = IF(T1.id = 0, T1.someColumn, T2.`0`),
    T2.`1` = IF(T1.id = 1, T1.someColumn, T2.`1`),
    T2.`2` = IF(T1.id = 1, T1.someColumn, T2.`1`)
WHERE T1.code = '$code'

someColumn 替换为T1 中包含您要放入T2 中的值的列。

【讨论】:

  • 您还需要在这里拥有JOIN T1 ON T2.name = T1.id AND code = '$code'WHERE code = '$code'
  • 本例中的“名称”和“列”是什么?它们是 MySQL 关键字还是应该是我的表的一部分?
  • 您写了“行的名称将匹配 ID 的值”。所以name 是与 ID 值匹配的列。而column 是要在匹配的行中更新的列
  • 是的,我认为这不是很清楚。问题是我不知道列的名称,因为该名称将由我从第一个表中获得的 ID 定义。我更新了我的问题以更好地解释它。
  • 您能否更新问题以显示两个表中的示例数据以及更新的结果应该是什么?
【解决方案3】:

你可以在不使用子查询的情况下进行更新,只需使用 join

  update t2
  inner join t1 on t2.name = t1.id and t1.code ='$code'
  set t2.my_col = 'my_value'

但是你不应该在你的查询中使用 var 你有 sql 注入的风险看看你的 mysql driver for param_binding

【讨论】:

  • @RaymondNijland 。 .. 谢谢 .. 回答已更新,避免使用 t2.id .. 但一个通用列
【解决方案4】:
UPDATE T2 SET COL = YOUR_VALUE WHERE EXISTS 
 (SELECT 1 FROM T1 WHERE T2.id=T2.id AND code = '$code')

【讨论】:

  • 请提供一些关于上述代码如何回答问题的信息,以改进此答案。
【解决方案5】:

如果您希望内部查询至少有一行,则可以使用下一个 SQL 更新 T2

UPDATE T2 SET COLUMN = VALUE 
WHERE T2.ID IN (SELECT ID FROM T1 WHERE CODE = $code)

否则,如果从 T1 你确定你只会得到 1 条记录

UPDATE T2 SET COLUMN = VALUE 
WHERE T2.ID = (SELECT ID FROM T1 WHERE CODE = $code)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2016-04-06
    相关资源
    最近更新 更多