Mysql строк в столбцы, оптимизация запроса с использованием IF - PullRequest
1 голос
/ 28 февраля 2011

У меня есть следующий запрос:

SELECT a.rank AS rank, concat( m.prenom, ' ', m.nom ) AS name, d.department
FROM `0_area` AS a
LEFT JOIN 0_member AS m ON a.user_id = m.id
LEFT JOIN 0_depart AS d ON a.user_id = d.user_id
WHERE a.sec_id = 2
AND (a.rank = 'mod' OR a.rank = 'adm')
AND d.department IN ( 75, 92 )

Приведенный выше запрос возвращает мне три столбца с именем rank | name | department, и он работает, с отдельной строкой для каждого ранга по отношению к отделу.

rank | name | department

mod  |  Steven Smith   |  75   
mod  |  Jeremy Roy     |  92  
adm  |  Vincent Jones  |  75  

Что мне нужно, так это собрать всю эту информацию в одну строку, потому что она нужна мне как часть другого более крупного запроса, который возвращает только одну строку.

Я подумал о group_concat, и иметь две колонки, одну для мода и одну для adm.В случае, если есть несколько модов (в 75, 92 для данного примера), они будут разделены запятыми.

mod  | adm   

Steven Smith, Jeremy Roy   |  Vincent Jones

Я был понятен?Спасибо друзья.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2011

Какой-то гугл сказал мне, что мне нужен этот sql:

SELECT 
GROUP_CONCAT( if( a.rank='mod', concat( m.prenom, ' ', m.nom ), '' ) ) AS 'mod', 
GROUP_CONCAT( if( a.rank='adm', concat( m.prenom, ' ', m.nom ), '' ) ) AS 'adm'
FROM `0_area` AS a
LEFT JOIN 0_member AS m ON a.user_id = m.id
LEFT JOIN 0_depart AS d ON a.user_id = d.user_id
WHERE a.sec_id =2
AND (a.rank = 'mod' OR a.rank = 'adm' )
AND d.department IN ( 75, 92 )
GROUP BY a.sec_id

@ ToonMariner Это решает проблему для этого запроса, однако мне все еще нужно соединить два запроса. Возможно, я создам новый пост для этого.

0 голосов
/ 28 февраля 2011

Что-то вроде:

SELECT
    a.rank AS rank,
    concat( m.prenom, ' ', m.nom ) AS name,
    GROUP_CONCAT(d.department ORDER BY d.department ASC SEPARATOR '|')
FROM
    `0_area` AS a
LEFT JOIN
    0_member AS m
ON
    a.user_id = m.id
LEFT JOIN
    0_depart AS d
ON
    a.user_id = d.user_id
WHERE
    a.sec_id = 2
AND
    (a.rank = 'mod' OR a.rank = 'adm')
AND
    d.department IN ( 75, 92 )
GROUP BY
    a.rank
...