このようなクエリを求めていると思います
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のデモです