Как объединить несколько строк с одинаковым идентификатором MySQL

Я здесь недавно публикуюсь, но сообщество было моим лучшим ресурсом о моих проектах.
Я тупой / глупый Mysql «хочу быть», и я нахожусь в центре проекта, который заставляет меня сходить с ума.

У меня есть таблица из плагинов WordPress buddypress, которая объединяет meta_key и meta_values ​​для создания чего-то похожего на таксономию. Моя обязанность состоит в том, чтобы использовать эти парные значения для реализации расширенного группового поиска. Вот оригинальная таблица:

--------------------------------------------
id | group_id | meta_key           | meta_value
--------------------------------------------
1  | 1        | time-zone          | Kwajalein
2  | 1        | playstyle          | hardcore
3  | 1        | recruiting-status  | Open
4  | 1        | ilvl               | 115
5  | 1        | main-raid          | Final Coil of Bahamut
6  | 1        | voicechat          | fc.teamspeak3.com

так далее….

Используя представление, мне удалось создать более удобную для поиска таблицу для начинающих:


gid| time-zone| playstyle  | main-raid
--------------------------------------------
1  |          |            |
1  |Kwajalein |            |
1  |          | hardcore   |
1  |          |            |
1  |          |            | Final Coil of Bahamut
1  |          |            |

А вот код вида:

SELECT distinct
group_id AS 'gid',
IF(meta_key='recruiting-status',meta_value,'') AS 'Recruitment',
IF(meta_key='server',meta_value,'') AS 'server',
IF(meta_key='time-zone',meta_value,'') AS 'tzone',
IF(meta_key='main-raid',meta_value,'') AS 'raid',
IF(meta_key='raid-days',meta_value,'') AS 'days',
IF(meta_key='playstyle',meta_value,'') AS 'playstyle',
IF(meta_key='raid-progression',meta_value,'') AS 'progression',
IF(meta_key='raid-time',meta_value,'') AS 'time',
IF(meta_key='tanker-spot',meta_value,'') AS 'tank',
IF(meta_key='healer-spot',meta_value,'') AS 'healer',
IF(meta_key='melee-dps-spot',meta_value,'') AS 'melee',
IF(meta_key='ranged-dps-spot',meta_value,'') AS 'ranged',
IF(meta_key='magic-dps-spot',meta_value,'') AS 'magic',
IF(meta_key='ilvl',meta_value,'') AS 'ilvl',
IF(meta_key='voicechat',meta_value,'') AS 'voice',
IF(meta_key='voicechatpass',meta_value,'') AS 'voicep',
FROM wpstatic_bp_groups_groupmeta

Дело в том, что мне нужно объединить этот результат (представление), чтобы все group_id = 1, 2 или 3 и т. Д. Стояли в одной строке, например:


gid| time-zone| playstyle  | main-raid
--------------------------------------------
1  |Kwajalein | hardcore   | Final Coil of Bahamut
2  |SaoPaulo  | regular    | Second Coil of Bahamut

так далее

Может ли кто-нибудь помочь мне там?

2

Решение

Просто окружи свой IFв MAXили другая агрегатная функция, которая будет захватывать непустые строки (например, GROUP_CONCAT) и добавить GROUP BY group_id добавить конец. Например,

SELECT
group_id AS gid,
MAX(IF(meta_key='recruiting-status',meta_value,'')) AS 'Recruitment',
MAX(IF(meta_key='server',meta_value,'')) AS 'server',
...
FROM wpstatic_bp_groups_groupmeta
GROUP BY group_id
2

Другие решения

Других решений пока нет …