我相信你在这样的查询之后
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演示