【问题标题】:#1242 - Subquery returns more than 1 row - mysql#1242 - 子查询返回多于 1 行 - mysql
【发布时间】:2012-09-17 20:04:30
【问题描述】:

我正在尝试创建一个从 MySQL 数据库中选择图像名称的 select 语句。 该表称为-pictures_archive。我也在尝试根据它们拥有的类别来选择这些图片。代码是:

SELECT pictures_archive_filename FROM pictures_archive 
WHERE pictures_archive_id = (SELECT pictures_archive_id 
FROM pictures_archive_category WHERE pictures_category_id = 9)

它给了我一个“#1242 - 子查询返回超过 1 行”错误。我知道为什么,但不知道该怎么做。

【问题讨论】:

    标签: mysql mysql-error-1242


    【解决方案1】:

    使用 IN 而不是等号 (=)

    SELECT pictures_archive_filename FROM pictures_archive 
    WHERE pictures_archive_id IN (SELECT pictures_archive_id 
    FROM pictures_archive_category WHERE pictures_category_id = 9)
    

    或者如果可能的话,在 2 个表之间使用 JOIN

    【讨论】:

      【解决方案2】:

      由于您的子查询可以返回多个值,IN 应该适合您的 where 子句。

      SELECT pictures_archive_filename 
      FROM pictures_archive 
      WHERE pictures_archive_id IN 
      (
         SELECT pictures_archive_id 
         FROM pictures_archive_category 
         WHERE pictures_category_id = 9
      )
      

      对此的替代方法是join 这两个表更有效。

      SELECT  pictures_archive_filename 
      FROM    pictures_archive a 
              INNER JOIN pictures_archive_category b
                  ON a.pictures_archive_id = b.pictures_archive_id
      WHERE   b.pictures_category_id = 9
      

      【讨论】:

      • 被类似的东西困住了。非常感谢
      • 我在一个有超过 2000 万行(索引)的表上尝试了替代方法 JOIN,因为它提到它比使用 IN 更有效
      【解决方案3】:
      SELECT pictures_archive_filename FROM pictures_archive 
      WHERE pictures_archive_id = (SELECT pictures_archive_id 
      FROM pictures_archive_category WHERE pictures_category_id = 9 LIMIT 1)
      

      【讨论】:

        【解决方案4】:
        SELECT p.pictures_archive_filename FROM 
        pictures_archive p inner join pictures_archive_category pc 
        on p.pictures_archive_id = pc.pictures_archive_id 
        where pc.pictures_category_id=9
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-28
          • 1970-01-01
          相关资源
          最近更新 更多