如何连接子查询元素

时间:2014-06-17 08:11:18

标签: mysql

我有一个数据库表,其中包含一个字段'profile_id',其中包含与分隔符逗号连接的配置文件ID。我知道这是一个粗鲁的解决方案,但不能改变它,因为系统使用这个数据库已经很久了(在我加入开发之前),重新设计数据库将是一项艰巨的任务。所以我需要一个查询,我可以将简短的个人资料标识粘在一起,而不是profile_ids。 这是一个明确的例子:

SELECT 
    production_stages.id,
    production_stages.`name`, 
    production_stages.production_stage_group_id,
    production_stages.profile_id,
    production_stages.is_terminal,
    IF((SELECT COUNT(*) FROM finished_production_serial_stages WHERE stage_id = production_stages.id) = 0, 0, 1) AS 'in_use'
FROM production_stages WHERE production_stage_group_id = 11

此查询将返回如下内容:result table

我尝试选择并连接相应的配置文件短名称,但我只获得第一个。这是查询:

SELECT 
    production_stages.id,
    production_stages.`name`,
    production_stages.production_stage_group_id,
    (SELECT CONCAT(short_name) FROM `profile` WHERE profileid IN(production_stages.profile_id)) AS 'profiles',
    production_stages.profile_id,
    production_stages.is_terminal,
    IF((SELECT COUNT(*) FROM finished_production_serial_stages WHERE stage_id = production_stages.id) = 0, 0, 1) AS 'in_use'
FROM production_stages WHERE production_stage_group_id = 11

正如您在结果中看到的那样,profiles列只包含一个配置文件短名称: enter image description here

我想在个人资料栏中找到类似ADM,AGV,AGM,BESZLA的内容。当然,在配置文件表中,profile_ids指的是配置文件的short_name,例如: 1-> ADM,13-> AGV,12-> AGM,19-> BESZLA

1 个答案:

答案 0 :(得分:2)

您尝试使用IN()子句的方式不适用于存储在您需要使用的列中的逗号分隔值FIND_IN_SET()

SELECT 
    ps.id,
    ps.`name`,
    ps.production_stage_group_id,
    GROUP_CONCAT(p.short_name) AS `profiles`,
    ps.profile_id,
    ps.is_terminal,
    IF((SELECT COUNT(*) FROM finished_production_serial_stages WHERE stage_id = ps.id) = 0, 0, 1) AS 'in_use'
FROM production_stages ps
JOIN `profile` p ON(FIND_IN_SET(p.profileid,ps.profile_id) > 0)
WHERE ps.production_stage_group_id = 11
GROUP BY ps.id
  

使用GROUP_CONCAT的注意事项:结果被截断为最大长度   group_concat_max_len系统变量,其默认值为   1024.该值可以设置得更高,尽管返回值的有效最大长度受值的约束   max_allowed_pa​​cket的