0

每次我尝试运行此查询时,它都会出现此错误
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;
4

2 回答 2

2

我相信你在这样的查询之后

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

样本输出:

| 文件名 | 电话 |
--------------------------
| 2012 年 12 月 | 120-1111532 |
| 2012 年 12 月 | 123-1111111 |
...
| 2013 年 1 月 | 111-1116677 |
| 2013 年 1 月 | 133-1111234 |
...

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

另一种方法是将GROUP_CONCAT每个文件名的所有电话打包在一个分隔字符串中,您可以在遍历结果集时轻松地在 php 中展开

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

样本输出:

| 文件名 | 电话 |
-------------------------------------------------- ----------------------------------
| 2012 年 12 月 | 120-1111532,123-1111111,133-1111144 |
| 2013 年 1 月 | 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

但这没有任何意义,因为除了行号之外,您没有任何公共列可以对数据进行分组。

您的结果集将如下所示

| 随机数 | 2012 年 12 月 | 2013 年 1 月 |
----------------------------------
| 1 | 123-1111111 | 111-1116677 |
| 2 | 120-1111532 | 172-1111089 |
| 3 | 133-1111144 | 133-1111234 |
| 4 | (空) | 199-6571114 |
| 5 | (空) | 156-9851115 |
...

这是SQLFiddle演示

于 2013-07-28T06:50:44.870 回答
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()or 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

希望对您有所帮助... :)

于 2013-07-28T06:46:34.477 回答