每次我尝试运行此查询时都会出现此错误 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;
答案 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()
希望有帮助......:)