代码之家  ›  专栏  ›  技术社区  ›  Majid Fouladpour

在一个版本的查询中出现Mysql错误1111,在另一个版本中出现错误1054

  •  0
  • Majid Fouladpour  · 技术社区  · 14 年前

    我有两张桌子:

    • 图书:[isbn,书名,出版商,…]
    • 库存:[isbn,日期,数量变化]

    我想退货库存的书。我尝试了一个连接(查询1),得到了1054个错误,然后用文本值替换了引用,现在得到了1111个错误。

    问题1:

    SELECT `books`.`isbn`, `books`.`book_title`, SUM( `inventory`.`numbers_changed` ) AS `num`
    FROM `books`
    INNER JOIN `inventory` ON `books`.`isbn` = `inventory`.`isbn`
    WHERE `books`.`publisher` LIKE '%pint%'
    AND `num` > '0'
    

    问题2:

    SELECT `books`.`isbn`, `books`.`book_title`, SUM( `inventory`.`numbers_changed` )
    FROM `books`
    INNER JOIN `inventory` ON `books`.`isbn` = `inventory`.`isbn`
    WHERE `books`.`publisher` LIKE '%print%'
    AND SUM( `inventory`.`numbers_changed` ) > '0'
    

    正确的查询是什么?

    编辑
    以下是创建表查询:

    CREATE TABLE IF NOT EXISTS `books` (
      `isbn` varchar(30) CHARACTER SET ascii NOT NULL,
      `book_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL,
      `date_published` varchar(10) CHARACTER SET ascii NOT NULL,
      `author` varchar(40) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL,
      `translator` varchar(40) CHARACTER SET utf8 COLLATE utf8_persian_ci DEFAULT NULL,
      `publisher` varchar(50) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL,
      `ganre` varchar(50) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL,
      `price` int(7) unsigned NOT NULL,
      `cover_pic` int(1) unsigned NOT NULL DEFAULT '0',
      PRIMARY KEY (`isbn`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    CREATE TABLE IF NOT EXISTS `inventory` (
      `isbn` varchar(30) CHARACTER SET ascii NOT NULL,
      `date` varchar(10) CHARACTER SET ascii NOT NULL,
      `numbers_changed` int(5) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   OMG Ponies    14 年前

    1054错误是关于引用不存在的列。实际的错误消息将有助于了解问题的起因。

    1111错误是因为您试图在WHERE子句中使用聚合函数(在本例中为SUM):

    WHERE ...
      AND SUM( `inventory`.`numbers_changed` ) > '0'  
          ^
          |__ see this?
    

    ...在子查询之外。SQL语句是自下而上检查的,所以我希望删除WHERE子句中的SUM将表明1054错误仍然没有得到解决。

        2
  •  1
  •   user1061544    13 年前

    使用having作为第二个where参数

    WHERE `books`.`publisher` LIKE '%print%' 
    HAVING ( COUNT(`inventory`.`numbers_changed`)  > '0')
    

    而不是

    WHERE `books`.`publisher` LIKE '%print%'
    AND SUM( `inventory`.`numbers_changed` ) > '0'