【问题标题】:MySQL error 1242 - Subquery returns more than 1 rowMySQL 错误 1242 - 子查询返回多于 1 行
【发布时间】:2015-01-15 12:12:07
【问题描述】:

我在数据库中有两个表,结构如下:

表 1:3 行 - category_id、product_id 和 position

表 2:3 行 - category_id、product_id 和 position

我正在尝试将表 1 位置设置为表 2 位置,其中类别和产品 ID 与表中的相同。

下面是我尝试实现但返回 MySQL 错误 1242 的 sql - 子查询返回超过 1 行

UPDATE table1 
SET position = (
    SELECT position 
    FROM table2 
    WHERE table1.product_id = table2.product_id AND table1.category_id = table2.category_id
)

【问题讨论】:

  • 尝试单独运行您的 INNER 查询并告诉我们结果
  • 我收到以下错误 #1054 - 'where 子句'中的未知列 'table1.product_id'
  • 然后我收到 #1052 - 字段列表中的列“位置”不明确
  • 这意味着 MYSQL 与 postion 混淆是哪个表和来自哪个表...您应该先学习一些 MySQL 教程
  • 我在你发布的内部连接中尝试了 table1.position,我现在收到了来自 table1 的所有位置行

标签: php mysql database


【解决方案1】:

解决方案非常简单,只需两个简单的步骤即可完成。第一步只是预览将要更改的内容,以避免破坏数据。如果您对 WHERE 子句有信心,可以跳过它。

第 1 步:预览更改

使用您要匹配的字段加入表格,选择所有内容以进行匹配的可视化验证。

SELECT t1.*, t2.*
FROM table1 t1
    INNER JOIN table2 t2
        ON t1.category_id = t2.category_id
        AND t1.product_id = t2.product_id

如果只需要修改部分行,您也可以添加WHERE 子句。

Step2:进行实际更新

将SELECT子句和FROM关键字替换为UPDATE,在其所属的地方添加SET子句。保留WHERE 子句:

UPDATE table1 t1
    INNER JOIN table2 t2
        ON t1.category_id = t2.category_id
        AND t1.product_id = t2.product_id
SET t1.position = t2.position

就是这样。

技术考虑

当表的行数超过几百行时,两个表的JOIN 子句中使用的列的索引是必须的。如果查询没有WHERE 条件,那么MySQL 将只对最大的表使用索引。 WHERE 条件上使用的字段的索引将加快查询速度。在 SELECT 查询前添加 EXPLAIN 以检查执行计划并确定您需要哪些索引。

您可以添加SORT BY 和LIMIT 以使用WHERE 无法实现的条件(例如,仅最新/最旧的100 行等)进一步减少更改的行集。首先将它们放在SELECT 查询中以验证结果,然后将SELECT 变形为UPDATE,如所述。 当然,SORT BY 子句中使用的列的索引是必须的。

【讨论】:

  • 谢谢你,这帮了很多忙:)
【解决方案2】:

您可以运行此查询以查看发生了什么:

SELECT product_id, category_id, count(*), min(position), max(position)
FROM table2
GROUP BY product_id, category_id
HAVING COUNT(*) > 1;

这将为您提供在table2 中多次出现的product_id、category_id 对列表。然后你可以决定做什么。您想要position 的任意值吗? position 的值是否始终相同?你需要修桌子吗?

使用limit 1 或聚合函数很容易解决特定问题。但是,您可能确实需要修复表中的数据。修复如下:

UPDATE table1 t1
    SET t1.position = (SELECT t2.position 
                       FROM table2  t2
                       WHERE t2.product_id = t1.product_id AND t2.category_id = t1.category_id
                       LIMIT 1
                      );

【讨论】:

  • 它是由其他人创建的数据库,因此没有具有唯一标识的列,例如ID,只有 3 行,我需要发生的是如果 table2.category_id = table1.category_id 和 table2.product_id = table1.product_id 然后将 table1.position 设置为 table2.position 的值,它具有类别和产品 id
  • @RyanK。 . .然后使用limit 1 或select max(t2.position)。这些都可以解决问题。
猜你喜欢
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多