0

このクエリを実行しようとするたびに、このエラーが発生します
1242 - サブクエリは複数の行を返します

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で簡単に反復できる、一度に必要なデータを含む適切に順序付けられた結果セットが得られます。

別のアプローチは、ファイル名ごとにすべての電話を区切られた文字列にパックするために使用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

行番号以外にデータをグループ化できる共通の列がないため、意味がありません。

結果セットは次のようになります

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

各クエリに対して単一の結果が必要なのか、各クエリのすべての結果が必要なのかはわかりませんが、すべての結果が必要な場合は、次の 1 つの方法を使用します (ただし、同じテーブルに対して 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()単一の結果のみが必要な場合は、サブクエリに 1 つの結果のみを返すように指示するもの (または など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 に答える