首页 文章

错误#1242 - 子查询返回多于1行

提问于
浏览
0

每次我尝试运行此查询时都会出现此错误
1242 - Subquery returns more than 1 row

SELECT(SELECT numbers.phone FROM numbers WHERE numbers.filename = 'Jan-2013') AS Jan2013,
(SELECT numbers.phone FROM numbers WHERE numbers.filename = 'Dec-2012') AS Dec2012

实际上我不知道问题出在哪里 .
这就是桌面设计 .

CREATE TABLE `numbers` (
  `id` int(11) NOT NULL auto_increment,
  `phone` varchar(255) NOT NULL,
  `phonecalls` int(3) NOT NULL,
  `duration` float NOT NULL,
  `cost` varchar(10) NOT NULL,
  `city` varchar(255) default NULL,
  `category` varchar(255) default NULL,
  `website` varchar(255) default NULL,
  `reported` int(1) NOT NULL default '0',
  `filename` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12065 DEFAULT CHARSET=latin1;

2 回答

  • 2

    不确定每个查询是否需要单个结果或每个查询的所有结果,但如果你想要所有结果,这里有一个方法(虽然这不是最快的方法,因为你要查询同一个表两次,但它至少应该得到你的结果):

    SELECT n1.phone as Jan2013, n2.phone AS Dec2012
    FROM numbers AS n1, numbers AS n2
    WHERE n1.filename = 'Jan-2013'
    AND n2.filename = 'Dec-2012'
    

    如果你只想要一个结果,你应该能够使用你已经拥有的代码,除非你必须指定一些东西告诉子查询只返回一个结果(例如 MAX()MIN() ):

    SELECT
    (SELECT MAX(numbers.phone) FROM numbers WHERE numbers.filename = 'Jan-2013') AS Jan2013,
    (SELECT MIN(numbers.phone) FROM numbers WHERE numbers.filename = 'Dec-2012') AS Dec2012
    

    希望有帮助...... :)

  • 0

    我相信你是在经历了这样的查询之后

    SELECT filename, phone
      FROM numbers
     WHERE filename IN ('Dec-2012', 'Jan-2013')
     ORDER BY filename, phone
    

    样本输出:

    | FILENAME |       PHONE |
    --------------------------
    | Dec-2012 | 120-1111532 |
    | Dec-2012 | 123-1111111 |
    ...
    | Jan-2013 | 111-1116677 |
    | Jan-2013 | 133-1111234 |
    ...
    

    它将为您提供一个正确排序的结果集,其中包含您可以一次性使用的数据,您可以在php中轻松地进行迭代 .

    Another approach 是使用 GROUP_CONCAT 将每个文件名的所有手机打包在一个分隔的字符串中,当您迭代结果集时,您可以轻松地在php中爆炸

    SELECT filename, GROUP_CONCAT(phone ORDER BY phone) phones
      FROM numbers
     WHERE filename IN ('Dec-2012', 'Jan-2013')
     GROUP BY filename
    

    样本输出:

    | FILENAME |                                                                  PHONES |
    --------------------------------------------------------------------------------------
    | Dec-2012 | 120-1111532,123-1111111,133-1111144                                     |
    | Jan-2013 | 111-1116677,133-1111234,156-9851115,171-1274116,172-1111089,199-6571114 |
    

    Now you definitely don't want 在单独的列中获取每个文件名的电话号码 . 你可以通过这样的查询在技术上做到这一点

    SELECT rnum, 
           MIN(CASE WHEN filename = 'Dec-2012' THEN phone END) `Dec-2012`,
           MIN(CASE WHEN filename = 'Jan-2013' THEN phone END) `Jan-2013`
      FROM
    (
      SELECT n.*, IF(@g = filename, @n := @n + 1, @n := 1) rnum, @g := filename
        FROM numbers n, (SELECT @n := 1) i
       WHERE filename IN ('Dec-2012', 'Jan-2013')
    ) q
     GROUP BY rnum
    

    但这没有任何意义,因为您没有任何公共列,您可以将数据分组而不是行号 .

    您的结果集看起来像这样

    | RNUM |    DEC-2012 |    JAN-2013 |
    ------------------------------------
    |    1 | 123-1111111 | 111-1116677 |
    |    2 | 120-1111532 | 172-1111089 |
    |    3 | 133-1111144 | 133-1111234 |
    |    4 |      (null) | 199-6571114 |
    |    5 |      (null) | 156-9851115 |
    ...
    

    这是 SQLFiddle 演示

相关问题