JOIN
次の構造を持つ一時テーブルがあります (同じクエリで 2 回開くことができないため、これは重要です)。
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ごとに表示したい」と言った場合、次のように表示する必要があります。
+------------+-----------+--------------+
| 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 の 2 つの値があるため、組み合わせのツリーごとに 1 つずつ、2 つの結果を表示する必要があります。 .
に 3 つの値がcategory_id = 3
ある場合、ツリーの可能な組み合わせをすべて取得する必要があります。
私もPHPを使用しているので、データを解析して操作するソリューションも正しいものになる可能性があります。
GROUP_CONCAT()
、HAVING COUNT(category_id)
およびを使用しようとしましたがORDER BY FIELD(category_id)
、JOIN を使用できないため、考えられるすべての組み合わせの結果を表示することができませんでした。
ご協力いただき、ありがとうございました。