Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL基于类似字段的自连接_Mysql_Self Join - Fatal编程技术网

MySQL基于类似字段的自连接

MySQL基于类似字段的自连接,mysql,self-join,Mysql,Self Join,在我们开始之前,不要怪我,我没有设计数据库。我很清楚,必要时可以添加列 考虑一下mySQL的这个片段: SELECT r.id, crf.field_name, crf.field_value FROM reports r JOIN custom_report_fields crf ON crf.report_id = r.id WHERE r.id IN ( 100, 101 ) AND field_name LIKE "service_%" 这会产生这

在我们开始之前,不要怪我,我没有设计数据库。我很清楚,必要时可以添加列

考虑一下mySQL的这个片段:

SELECT r.id,
   crf.field_name,
   crf.field_value
FROM reports r
   JOIN custom_report_fields crf
     ON crf.report_id = r.id
WHERE r.id IN ( 100, 101 )
   AND field_name LIKE "service_%"  
这会产生这些无用的结果:

ID   | field_name     | field_value
------------------------------------------------
100  | service_id_1   | 20
100  | service_name_1 | "Shipping"
100  | service_cost_1 | 5.25
101  | service_id_1   | 21
101  | service_name_1 | "Handling"
101  | service_cost_1 | 7.50
101  | service_id_2   | 20
101  | service_name_2 | "Shipping"
101  | service_cost_2 | 7.75
我需要一个能产生如下结果的查询:

Report ID | Field ID | Name       | Cost
------------------------------------------------
100       | 20       | "Shipping" | 5.25
101       | 21       | "Handling" | 7.50
101       | 20       | "Shipping" | 7.75
请注意,一份报告可能会涉及任意数量的成本,每个连续的成本都会得到另外三个条目和一个增加的后缀(“服务\u id\u x”,“服务\u名称\u x”,“服务\u成本\u x”)


回答这个问题的人将获得比你所选择的宗教的其他追随者更优越的来世。

试试这个解决方案。它相当笨重(只有考虑到设计本身笨重的性质,它才能如此优雅!),但它的工作原理是:

SELECT
    a.id AS Report_ID,
    MAX(CASE WHEN b.field_name LIKE 'service_id_%' THEN b.field_value END) AS Field_ID,
    MAX(CASE WHEN b.field_name LIKE 'service_name_%' THEN b.field_value END) AS Name,
    MAX(CASE WHEN b.field_name LIKE 'service_cost_%' THEN b.field_value END) AS Cost
FROM
    reports a
INNER JOIN
    custom_report_fields b ON a.id = b.report_id
WHERE
    a.id IN (100, 101) AND
    b.field_name LIKE 'service_%'
GROUP BY
    a.id,
    SUBSTRING_INDEX(b.field_name, '_', -1)

如果条目不符合顺序,这不会导致问题吗?@lukethemounder,我刚刚编辑了我的解决方案。只要您没有重复的
报告\u id->field\u name
的组合,它就非常有效。在示例数据中,您对同一个
报告id
(名称和成本相同)多次使用
服务id\u 1
,这将导致此解决方案中断。我想你可能打错了,因为你说每三个字段的数字都会增加。如果这不是错误输入,那么我就不能给你一个有效的解决方案,因为据我所知,没有办法将
字段值
s与
字段名称
s正确对齐。捕捉得好!这确实是个打字错误。我今天将试用你的解决方案,并让你知道它是如何运行的。效果非常好。这是解决一个不雅问题的最优雅的办法。谢谢。为什么表中不止一次出现
service\u id\u 1
service\u name\u 1
service\u cost\u 1
1
不应该像你说的那样随着成本的增加而增加吗?所有三个字段中的行是否唯一?