我有一个临时的(这很重要,因为我无法在同一个查询上打开它两次以使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。
感谢大家的帮助和时间!