根据一列中的值链接的 MySQL table 数据构建一个多维 PHP 数组
Build a multidimensional PHP array out of MySQL table data linked by values in one column
我正在使用 Wordpress 插件(高级 CF7 数据库)。它将联系表的结果放入 MySQL 数据库中,以便在网站的前端显示。
有两个 table 有这样的数据。
Table 1:
id | created
-------------------------------
1 | 2020-09-21 13:04:09
2 | 2020-09-22 13:04:09
3 | 2020-09-23 13:04:09
4 | 2020-09-24 13:04:09
5 | 2020-09-25 13:04:09
Table 2:
data_id| name | value
-------------------------------
1 | fname | Joe
1 | sname | Smith
1 | age | 19
1 | display | yes
1 | comment | Here is my comment
2 | fname | Jenny
2 | sname | Ford
2 | age | 20
2 | display | no
2 | comment | Here is my comment
3 | fname | Hazel
3 | sname | Brown
3 | age | 15
3 | display | yes
3 | comment | Here is my comment
table1中的id对应table2中的data_id。
我需要在两个单独的列表中显示网站上的评论(适用于 18 岁以上和以下的人),并且只在 'name = display' 和 'value = yes' 行中显示评论对应data_id.
示例:
15 岁以下人士的评论:
ID: 3
Name: Hazel Brown
Comment: Here is my comment
18 岁以上人士的评论
ID: 1
Name: Joe Smith
Comment: Here is my comment
最好的方法是将信息放入我可以操作的多维 PHP 数组中,还是应该尝试使用 MySQL 以我需要的格式获取信息是吗?
我不确定为什么你的 table 首先是这种格式,但你可以将你的 行值 设计成 列 首先,然后使用 HAVING
子句按您的条件进行过滤:
这是一个示例:
SELECT
t2.dataid,
MAX(IF(t2.name = 'fname', t2.value, NULL)) AS `fname`,
MAX(IF(t2.name = 'sname', t2.value, NULL)) AS `sname`,
MAX(IF(t2.name = 'age', t2.value, NULL)) AS `age`,
MAX(IF(t2.name = 'display', t2.value, NULL)) AS `display`,
MAX(IF(t2.name = 'comment', t2.value, NULL)) AS `comment`,
t1.created
FROM table2 t2
JOIN table1 t1 ON t2.dataid = t1.id
GROUP BY t2.dataid, t1.created
HAVING display = 'yes' AND age >= 18
# age <= 15 whatever your condition for age
之后就是获取它的问题了。旁注:我不是 wordpress 大师,但它相当简单,执行查询 -> 获取结果,将它们循环到你的标记中。
global $wpdb;
$query = '<your query here>';
$results = $wpdb->get_results($query);
foreach ($results as $row) {
echo 'ID: ', $row->dataid;
echo 'Name: ', $row->fname, ' ', $row->sname;
echo 'Comment: ', $row->comment;
}
这只是一个示例,您可以随意添加标记 html。
我正在使用 Wordpress 插件(高级 CF7 数据库)。它将联系表的结果放入 MySQL 数据库中,以便在网站的前端显示。
有两个 table 有这样的数据。
Table 1:
id | created
-------------------------------
1 | 2020-09-21 13:04:09
2 | 2020-09-22 13:04:09
3 | 2020-09-23 13:04:09
4 | 2020-09-24 13:04:09
5 | 2020-09-25 13:04:09
Table 2:
data_id| name | value
-------------------------------
1 | fname | Joe
1 | sname | Smith
1 | age | 19
1 | display | yes
1 | comment | Here is my comment
2 | fname | Jenny
2 | sname | Ford
2 | age | 20
2 | display | no
2 | comment | Here is my comment
3 | fname | Hazel
3 | sname | Brown
3 | age | 15
3 | display | yes
3 | comment | Here is my comment
table1中的id对应table2中的data_id。
我需要在两个单独的列表中显示网站上的评论(适用于 18 岁以上和以下的人),并且只在 'name = display' 和 'value = yes' 行中显示评论对应data_id.
示例:
15 岁以下人士的评论:
ID: 3
Name: Hazel Brown
Comment: Here is my comment
18 岁以上人士的评论
ID: 1
Name: Joe Smith
Comment: Here is my comment
最好的方法是将信息放入我可以操作的多维 PHP 数组中,还是应该尝试使用 MySQL 以我需要的格式获取信息是吗?
我不确定为什么你的 table 首先是这种格式,但你可以将你的 行值 设计成 列 首先,然后使用 HAVING
子句按您的条件进行过滤:
这是一个示例:
SELECT
t2.dataid,
MAX(IF(t2.name = 'fname', t2.value, NULL)) AS `fname`,
MAX(IF(t2.name = 'sname', t2.value, NULL)) AS `sname`,
MAX(IF(t2.name = 'age', t2.value, NULL)) AS `age`,
MAX(IF(t2.name = 'display', t2.value, NULL)) AS `display`,
MAX(IF(t2.name = 'comment', t2.value, NULL)) AS `comment`,
t1.created
FROM table2 t2
JOIN table1 t1 ON t2.dataid = t1.id
GROUP BY t2.dataid, t1.created
HAVING display = 'yes' AND age >= 18
# age <= 15 whatever your condition for age
之后就是获取它的问题了。旁注:我不是 wordpress 大师,但它相当简单,执行查询 -> 获取结果,将它们循环到你的标记中。
global $wpdb;
$query = '<your query here>';
$results = $wpdb->get_results($query);
foreach ($results as $row) {
echo 'ID: ', $row->dataid;
echo 'Name: ', $row->fname, ' ', $row->sname;
echo 'Comment: ', $row->comment;
}
这只是一个示例,您可以随意添加标记 html。