У меня есть три таблицы. Одна таблица называется places
, эта таблица имеет разные места (например, предприятия, рестораны и т. Д.), Каждое «место» связано с таблицей categories
, однако некоторые категории имеют подкатегории в иерархической структуре (например, Thai Food - это подкатегории ресторанов). Эта система позволяет администратору создавать места и сопоставлять их с соответствующей категорией или подкатегорией.Получение категорий и подкатегорий, связанных из таблиц Mysql
Что я хотел бы знать, так это лучший способ получить эти отношения? В настоящее время я использую JOINs и GROUP_CONCAT, но я все еще не получаю хороший набор результатов.
Это мои таблицы:
мест:
+----+----------------+
| id | name |
+----+----------------+
| 1 | Mings Place |
+----+----------------+
| 2 | Halsey Library |
+----+----------------+
| 3 | Stellas USO |
+----+----------------+
places_categories_rel:
+----------+-------------+
| place_id | category_id |
+----------+-------------+
| 1 | 2 |
+----------+-------------+
| 2 | 4 |
+----------+-------------+
| 3 | 3 |
+----------+-------------+
| 3 | 4 |
+----------+-------------+
категории:
Как вы можете видеть, некоторые места прикреплены к подкатегории, некоторые места прикрепляются непосредственно к родительской категории (без подкатегорий), а некоторые места имеют несколько подкатегорий, которые имеют разные родительские категории.
Чтобы получить мои результаты, я попытался следующий SQL:
'SELECT `p`.*,
GROUP_CONCAT(DISTINCT(CONCAT (ca.id, "|", `ca`.`parent_id`, "|", ca.name))) as subcategories,
GROUP_CONCAT(DISTINCT(CONCAT (ca1.id, "|", `ca1`.`parent_id`, "|", ca1.name))) as categories
FROM `places` `p`
LEFT JOIN `places_categories_rel` `rel` ON `rel`.`place_id`=`p`.`id`
LEFT JOIN `categories` `ca` ON `ca`.`id`=`rel`.`category_id`
LEFT JOIN `categories` `ca1` ON `ca1`.`id`=`ca`.`parent_id`
GROUP BY `p`.`id`
Но мои результаты придумали некоторые категории создаются как подкатегория или наоборот.
То, что я хотел бы, чтобы иметь некоторый тип результирующего набора, который позволил бы мне что-то вроде этого:
array (size=3)
0 =>
array (size=2)
'name' => string 'Mings Place' (length=11)
'categories' =>
array (size=1)
0 =>
array (size=2)
'name' => string 'Restaurant' (length=10)
'subcategories' =>
array (size=1)
0 => string 'Thai Food' (length=9)
1 =>
array (size=2)
'name' => string 'Halsey Library' (length=14)
'categories' =>
array (size=1)
0 =>
array (size=2)
'name' => string 'Government' (length=10)
'subcategories' =>
array (size=1)
0 => string 'Library' (length=7)
2 =>
array (size=2)
'name' => string 'Stellas' (length=7)
'categories' =>
array (size=2)
0 =>
array (size=2)
'name' => string 'Restaurant' (length=10)
'subcategories' =>
array (size=1)
0 => string 'Library' (length=7)
1 =>
array (size=2)
'name' => string 'Government' (length=10)
'subcategories' => null
В идеале, все это будет создано так, что я могу входные фильтры. Например, если я только хочу видеть места с категорией ресторанов или местами с правительством и подкатегорией итальянской кухни ...
Может кто-нибудь, пожалуйста, помогите мне понять это?
Вы можете получить всю категорию с подкатегорией в рекурсивном виде. Проверьте этот .http: //thecoderain.blogspot.in/2016/03/get-category-and-subcategory-tree-in.html – shubham715