如何在php/mysql中以简单的可排序表结构显示复杂记录集
我正在编写一个报告脚本,其中报告字段并不总是固定的。管理员可以添加/删除/修改字段。我已经为此创建了以下表格 报告如何在php/mysql中以简单的可排序表结构显示复杂记录集,php,mysql,mysqli,Php,Mysql,Mysqli,我正在编写一个报告脚本,其中报告字段并不总是固定的。管理员可以添加/删除/修改字段。我已经为此创建了以下表格 报告 id user_id csp_id date 1 1 1 2018-10-09 2 1 1 2018-10-10 3 2 2 2018-10-09 4 2 2 2018-10-10 meta_id display_name type default_v
id user_id csp_id date
1 1 1 2018-10-09
2 1 1 2018-10-10
3 2 2 2018-10-09
4 2 2 2018-10-10
meta_id display_name type default_value
csp_address CSP address text
csp_name CSP Name text
report_id user_id meta_id meta_value
1 1 csp_address Shivmandir
1 1 csp_name Shiv CSP
2 1 csp_address Matigara
2 1 csp_name Mat CSP
3 2 csp_address Darjeeling
3 2 csp_name Dar CSP
4 2 csp_address Gangtok
4 2 csp_name Gang CSP
报告元字段
id user_id csp_id date
1 1 1 2018-10-09
2 1 1 2018-10-10
3 2 2 2018-10-09
4 2 2 2018-10-10
meta_id display_name type default_value
csp_address CSP address text
csp_name CSP Name text
report_id user_id meta_id meta_value
1 1 csp_address Shivmandir
1 1 csp_name Shiv CSP
2 1 csp_address Matigara
2 1 csp_name Mat CSP
3 2 csp_address Darjeeling
3 2 csp_name Dar CSP
4 2 csp_address Gangtok
4 2 csp_name Gang CSP
报告元值
id user_id csp_id date
1 1 1 2018-10-09
2 1 1 2018-10-10
3 2 2 2018-10-09
4 2 2 2018-10-10
meta_id display_name type default_value
csp_address CSP address text
csp_name CSP Name text
report_id user_id meta_id meta_value
1 1 csp_address Shivmandir
1 1 csp_name Shiv CSP
2 1 csp_address Matigara
2 1 csp_name Mat CSP
3 2 csp_address Darjeeling
3 2 csp_name Dar CSP
4 2 csp_address Gangtok
4 2 csp_name Gang CSP
这就是在前端显示日期的方式,我还需要一个带有日期、csp_名称等的排序
id user_id csp_id date csp_name csp_adress
1 1 1 2018-10-09 Shiv CSP Shivmandir
2 1 1 2018-10-10 Mat CSP Matigara
3 2 2 2018-10-09 Dar CSP Darjeeling
4 2 2 2018-10-10 Gang CSP Gangtok
我尝试过这个sql,但这不是我想要的
SELECT reports.*, reports_meta_values.meta_id, reports_meta_values.meta_value FROM reports
INNER JOIN reports_meta_values WHERE reports.id = reports_meta_values.report_id
id user_id csp_id date meta_id meta_value
1 1 1 2018-10-09 csp_address Shivmandir
1 1 1 2018-10-09 csp_name Shiv CSP
2 1 1 2018-10-10 csp_address Matigara
2 1 1 2018-10-10 csp_name Mat CSP
3 2 2 2018-10-09 csp_address Darjeeling
3 2 2 2018-10-09 csp_name Dar CSP
4 2 2 2018-10-09 csp_address Gangtok
4 2 2 2018-10-09 csp_name Gang CSP
我正在寻找一个在mysql或php如何解决这个问题的建议。谢谢 我自己找到了答案,这应该是以适当结构显示数据的sql
SELECT reports.*, mt1.meta_value AS CSP_NAME, mt2.meta_value AS CSP_ADDRESS
FROM reports
INNER JOIN reports_meta_values mt1 ON reports.id = mt1.report_id AND
mt1.meta_id='csp_name'
INNER JOIN reports_meta_values mt2 ON reports.id = mt2.report_id AND
mt2.meta_id='csp_address'
WHERE 1
谢谢 我花了一点时间在数据库中进行设置,但是您应该使用两个
内部连接来区分meta_值,然后根据需要排序
SELECT a.*, b.meta_value AS csp_name, c.meta_value AS csp_address
FROM reports a
INNER JOIN reports_meta_values b ON a.id = b.report_id AND b.meta_id = 'csp_name'
INNER JOIN reports_meta_values c ON a.id = c.report_id AND c.meta_id = 'csp_address'
ORDER BY date, csp_name, csp_address
如果您提供了表的SQL导出,我已经给出了答案。现在我不得不费心写下这些表格和数据。很抱歉打扰您,但我自己找到了答案,我使用以下查询来解决问题,选择reports.*,mt1.meta_值作为CSP_名称,mt2.meta_值作为来自报告的CSP_地址内部联接报告中的mt1.id=mt1.report_id和mt1.meta_id='CSP_name'内部联接报告中的mt2.id=mt2.report_id和mt2.meta_id='CSP_地址'您希望如何继续?您是希望删除问题以恢复丢失的代表分数,还是希望保持页面活动并接受答案?如果您希望删除该页面,我可以撤回我的答案以允许删除,