表格
+----+-----+------------+
|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 |
+-----+------+------------+------------+------------+
为什么要这样?将相同的列名放在一起会使您很难确定需要哪一个。据我所知,不可能有重复的列名。
我假设您想要的是将值为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