查询组名称但显示其他具有限制的行

时间:2014-10-17 08:55:54

标签: php mysql group-by

+----+-----+------------+
|col1|col2 |col3        |
+----+-----+------------+
|A   |one  |1-jul-2013  |
|A   |two  |2-jul-2013  |
|A   |three|3-jul-2013  |
|A   |four |4-jul-2013  |
|A   |five |5-jul-2013  |
|B   |one  |1-jul-2013  |
|B   |two  |2-jul-2013  |
|B   |three|3-jul-2013  |
|B   |four |4-jul-2013  |
|B   |five |5-jul-2013  |
|B   |six  |6-jul-2013  |
|B   |seven|7-jul-2013  |
|B   |eight|8-jul-2013  |
|C   |one  |1-jul-2013  |
|C   |two  |2-jul-2013  |
|C   |three|3-jul-2013  |
|C   |four |4-jul-2013  |
|C   |five |5-jul-2013  |
|D   |one  |1-jul-2013  |
|D   |two  |2-jul-2013  |
|D   |three|3-jul-2013  |
|D   |four |4-jul-2013  |
|D   |five |5-jul-2013  |
+----+-----+------------+

我希望显示器看起来像这样:

+-----+------+------------+------------+------------+
|Group|Name  |Date        |Name        |Date        |        
+-----+------+------------+------------+------------+
| A   |one   |1-jul-2013  |two         |2-jul-2013  |
| B   |one   |1-jul-2013  |two         |2-jul-2013  |
| C   |one   |1-jul-2013  |two         |2-jul-2013  |
| D   |one   |1-jul-2013  |two         |2-jul-2013  |
+-----+------+------------+------------+------------+

2 个答案:

答案 0 :(得分:0)

你为什么要这样? 彼此相邻的列名使得有点难以找出您需要的列名。 据我所知,不可能有重复的列名。

答案 1 :(得分:0)

我假设您想要的是col1值的所有记录,而不是为每个值返回的特定列。

如果是这样,使用GROUP_CONCAT: -

SELECT col1, GROUP_CONCAT(CONCAT_WS('-', col2, col3) SEPARATOR ':')
FROM some_table
GROUP BY col1

如果您希望更容易处理它并且您的数据相当简单,您可以将返回的连接列构建为JSON编码数组(因此可以使用JSON_DECODE将其转换为数组以在PHP中处理): -

$sql = "SELECT col1, CONCAT('{\"', CONCAT('{\\\"', GROUP_CONCAT(CONCAT_WS('\\\":\\\"', col2, col3) SEPARATOR '\\\",\\\"') ,'\\\"}')
FROM some_table
GROUP BY col1";

如果你真的想要你所拥有的格式(忽略多个具有相同名称的列),那么你可以使用和IF来检查列值以决定是否返回另一个列值,并将聚合函数用于强制为该列返回一个值: -

SELECT col1, 
        'one',
        MAX(IF(col2='one', col3, NULL)),
        'two',
        MAX(IF(col2='two', col3, NULL)),
        'three',
        MAX(IF(col2='three', col3, NULL)),
        'four',
        MAX(IF(col2='four', col3, NULL)),
        'five',
        MAX(IF(col2='five', col3, NULL)),
        'six',
        MAX(IF(col2='six', col3, NULL)),
        'seven',
        MAX(IF(col2='seven', col3, NULL)),
        'eight',
        MAX(IF(col2='eight', col3, NULL))
FROM some_table
GROUP BY col1