2013-07-28 62 views
0

我試圖運行此查詢它給這個錯誤
1242 - 子查詢返回多個1行錯誤#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

這意味着'選擇numbers.phone從數字WHERE numbers.filename =「揚2013''或' SELECT numbers.phone FROM numbers WHERE numbers.filename ='Dec-2012''返回多於一行 –

+0

我建議您運行兩個'subSELECTs'並查看哪一個返回多個值。然後嘗試將該查詢限制爲1行。 –

+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 | 

現在,你肯定不希望得到pH值每個文件名在單獨的列中有一個數字。技術上可以做到這一點,像這樣

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 

查詢,但它是沒有意義的,因爲你沒有任何共同的列您可以將其他數據方面的行號。

你的ResultSet會是這個樣子

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

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()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 

希望幫助... :)

相關問題