MySQL - 以分层方式连接标记

时间:2016-06-10 10:49:36

标签: php mysql concatenation temp-tables hierarchical-trees

我有一个临时的(这很重要,因为我无法在同一个查询上打开它两次以使JOIN)表具有以下结构:

CREATE TEMPORARY TABLE `temp_report_tags` (
 `report_id` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `report_title` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
 `attr_value_id` bigint(20) NOT NULL,
 `attr_category_id` bigint(20) NOT NULL,
 `attribute_count` bigint(21) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

使用一些示例数据:

+-----------+--------------+---------------+------------------+-----------------+
| report_id | report_title | attr_value_id | attr_category_id | attribute_count |
+-----------+--------------+---------------+------------------+-----------------+
|         1 | SEN vs PUR   |            16 |                2 |               3 |
|         1 | SEN vs PUR   |            34 |                3 |              43 |
|         2 | PRA vs TLS   |            35 |                1 |              48 |
|         2 | PRA vs TLS   |            36 |                2 |              51 |
|         2 | PRA vs TLS   |            37 |                2 |               4 |
|         2 | PRA vs TLS   |            51 |                3 |               5 |
+-----------+--------------+---------------+------------------+-----------------+

我需要什么

我需要根据类别连接value_id,只有当报告包含用户想要的所有必需类别时才需要。

因此,在给定的示例中,如果用户说“我希望按category_id 1,2和3”查看报告,我需要显示以下内容:< / p>

+------------+-----------+--------------+
| value_tree | report_id | report_title |
+------------+-----------+--------------+
| 35,36,51   |         2 | PRA vs TLS   |
| 35,37,51   |         2 | PRA vs TLS   |
+------------+-----------+--------------+

如您所见,由于ID 1的报告没有类别1,因此必须从结果集中隐藏它,并且ID 2的报告对于类别2有两个值,它必须显示两个结果,每个结果一个组合树。

如果它有category_id = 3的三个值,那么我应该为它获得所有可能的树组合。

我也在使用PHP,所以解析数据并使用它的解决方案也是正确的。

我一直在努力与GROUP_CONCAT()HAVING COUNT(category_id)ORDER BY FIELD(category_id)合作,但我无法让它为每种可能的组合显示结果,因为我不能使用JOIN。

感谢大家的帮助和时间!

0 个答案:

没有答案