2016-07-19 6 views
0

Ну, у меня есть две таблицы в MySQL, как это:сделать колонны с левой присоединиться запрос

TABLE 1 - users 
------------- 
id | username | user_data 
1 | George | user_data 
2 | John  | user_data 


TABLE 2 - services 
------------- 
id | id_user | service_name | service_data 
1 | 1  | lunch  | whatever 
2 | 1  | dinner  | … 
3 | 2  | lunch  | … 

Ну, с этим, если я делаю запрос с LEFT JOIN, как это:

SELECT username, service_name 
FROM users 
LEFT JOIN services ON users.id = services.id_user 
WHERE 1 

I получил это:

username | service 
George | lunch 
George | dinner 
John  | lunch 

Но мне нужно напечатать, чтобы управлять данными в Excel сетки, как это:

username | service_1 | service_2 
George | lunch  | dinner 
John  | lunch 

У меня много рядов пользователей и служб, и невозможно сделать запрос с запросом услуг для каждого пользователя.

Любая идея сделать это только с одним запросом или любым трюком в PHP?

+0

Сколько видов услуг есть? Только обед и ужин, или что-то еще? –

+0

Привет Тим, количество услуг полностью динамически, может быть 5 или нулевым ... –

ответ

1

Вы можете использовать GROUP_CONCAT, но обратите внимание, что это не возвращает имена служб в отдельных столбцах, а всего лишь один столбец. Например:

SELECT username, GROUP_CONCAT(COALESCE(services.service_name, 'NA')) AS user_services 
FROM users 
LEFT JOIN services 
    ON users.id = services.id_user 
GROUP BY users.id; 

вернется: enter image description here

Я создал этот sqlfiddle:

SQLFiddle

+0

Что приятно об этом решении, оно может обрабатывать любое количество услуг изящно. –

+0

В любом случае мне нужны нулевые значения, чтобы сохранить все столбцы в порядке –

+0

@ JonayGalvánSánchez Пожалуйста, уточните – Ruben

0

Это, как представляется, проблема с сводной таблицы, может не работать, но попробовать его :

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(CASE WHEN s.service_data = ''', 
     service_data, 
     ''' THEN s.service_name ELSE '''' END) AS service_', 
     @rowno := @rowno + 1 
    ) 
) INTO @sql 
FROM (SELECT DISTINCT service_data FROM services) t1 
JOIN (SELECT @rowno := 0) t2; 
SET @sql = CONCAT('SELECT u.username, ', 
        @sql, 
        ' FROM services s 
        JOIN users u ON s.id_user = u.id 
        GROUP BY u.id'); 
-- SELECT @sql; 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQLFiddle Demo

+0

Привет, 10086! ваш запрос выводит пустой результат с нулевыми ошибками. Не могли бы вы объяснить свой запрос? –

+0

Вы проверили демо в своем ответе? http://sqlfiddle.com/#!9/daff7/9, у него есть результаты, подобные вашему вопросу. – Blank

+0

Да, я выполнил оба запроса (создание и выбор) в моей базе данных, но вернул пустой результат ... –

0

Прежде всего, эта проблема - всего лишь образец, чтобы объяснить мою настоящую проблему. Реальная проблема добавляет много таблиц, полей, больше объединений. Сервисы имеют (или нет) атрибуты в другой таблице.

Покойный мотив печатает результат для экспорта в CSV следующим образом: имя пользователя | футболка | размер | food_service | компаньоны
user_1 | да | XL | да | 1
user_2 | нет | NULL | да | 2
user_3 | да | NULL | да | 2

Смежные вопросы