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

时间:2013-07-28 05:31:29

标签: mysql sql

每次我尝试运行此查询时都会出现此错误 1242 - 子查询返回超过1行

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 个答案:

答案 0 :(得分:2)

我相信你正在经历这样的查询

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中轻松迭代这些数据。

另一种方法是使用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 |

现在你绝对不希望在不同的列中获取每个文件名的电话号码。您可以通过这样的查询在技术上做到这一点

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 演示

答案 1 :(得分:0)

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

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()或{ {1}}):

MIN()

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