Как отобразить сложный набор записей в простой сортируемой табличной структуре в php / mysql - PullRequest
0 голосов
/ 09 октября 2018

Я пишу сценарий отчетности, где поля отчетов не всегда фиксированы.Администратор может добавлять / удалять / изменять поля.Для этого я создал следующие таблицы:

отчеты

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

reports_meta_fields

meta_id      display_name  type  default_value
csp_address  CSP address   text
csp_name     CSP Name      text

reports_meta_values

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_name и т. Д.

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, как решить эту проблему.Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Мне потребовалось немного времени, чтобы настроить вещи в моей базе данных, но вы должны использовать два INNER JOIN s, чтобы различать значения meta_values, затем ORDER BY по желанию.

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

enter image description here

0 голосов
/ 09 октября 2018

Я нашел ответ сам, это должен быть 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

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...