使用左连接查询

时间:2016-07-19 01:53:01

标签: php mysql join

好吧,我在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中的任何技巧来做到这一点吗?

3 个答案:

答案 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;

将返回: enter image description here

我创建了这个sqlfiddle:

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;

SQLFiddle Demo

答案 2 :(得分:0)

首先,这个问题只是一个解释我真实问题的样本。真正的问题增加了很多表,字段,更多的连接。这些服务在其他表中具有(或不具有)属性。

后期动机是打印一个以CSV格式导出的结果: 用户名| T恤|尺寸| food_service |同伴
user_1 |是的| XL |是的| 1
user_2 |没有| NULL |是的| 2
user_3 |是的| NULL |是的| 2