好吧,我在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 | …
好吧,如果我使用这样的左连接进行查询:
SELECT username, service_name
FROM users
LEFT JOIN services ON users.id = services.id_user
WHERE 1
我明白了:
username | service
George | lunch
George | dinner
John | lunch
但我需要打印来管理excel这样的网格中的数据:
username | service_1 | service_2
George | lunch | dinner
John | lunch
我有很多用户和服务行,并且无法为每个用户提出查询请求。
任何想法只用一个查询或PHP中的任何技巧来做到这一点吗?
答案 0 :(得分: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;
我创建了这个sqlfiddle:
答案 1 :(得分: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;
答案 2 :(得分:0)
首先,这个问题只是一个解释我真实问题的样本。真正的问题增加了很多表,字段,更多的连接。这些服务在其他表中具有(或不具有)属性。
后期动机是打印一个以CSV格式导出的结果:
用户名| T恤|尺寸| food_service |同伴
user_1 |是的| XL |是的| 1
user_2 |没有| NULL |是的| 2
user_3 |是的| NULL |是的| 2