如何在php/mysql中以简单的可排序表结构显示复杂的记录集

7xzttuei  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(286)

我正在编写一个报告脚本,其中报告字段并不总是固定的。管理员可以添加/删除/修改字段。我已经为此创建了下表,
报告

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\ U名称等排序

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如何解决这个问题的建议。谢谢!

ulydmbyx

ulydmbyx1#

我自己找到了答案,这应该是以适当的结构显示数据的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

谢谢!

xwbd5t1u

xwbd5t1u2#

我花了一点时间在数据库中进行设置,但您应该使用两个 INNER JOIN s来区分meta\u值,然后根据需要排序。

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

相关问题