Выберите записи, имеющие category_id где-нибудь в дереве категорий

Я показываю дерево категорий, и рядом с каждой веткой я хочу подсчитать количество объявлений того же уровня или ниже.

У всех списков есть катида, которая находится на самом низком уровне категории. то есть вы не можете применить конкретную катиду к списку, если доступны более низкие уровни категории.

Например, в приведенной ниже таблице «списки» вы не можете найти список, в котором есть catid = 24, поскольку это еще не самый низкий уровень в дереве вдоль этой ветви.

В моей базе данных категорий есть максимум 4 уровня (0-3).

Вот таблицы:

all_categories (таблица)

record_id  parent_category_id   parent_id  title        level
--------------------------------------------------------------------- 
24         NULL                 NULL       Real Estate  0
5915       24                   24         Residential  1
7569       5915                 24         For sale     2

списки (таблица)

record_id    cat_id
--------------------
1            7569
2            8847

Итак, мое дерево категорий в HTML должно выглядеть примерно так:

HTML

Categories              Listing count
-------------------------------------
24                      1
  5915                  1
    7569                1

Итак, в моем html и jQuery-коде я передаю в запрос определенную категорию любого уровня, и он должен находить списки, которые находятся на этом уровне или ниже.

Я пытался часами, и мои усилия пока не стоят того, чтобы их показывать. Но я все равно буду ...

РЕДАКТИРОВАТЬ: Мои усилия до сих пор (не смейтесь, это запутано после нескольких часов пробовать разные вещи):

select l.record_id 
from listings l
where catid in (
    select record_id 
    from all_categories 
    where record_id = 5915)
or catid in (
    select parent_category_id 
    from all_categories 
    where parent_category_id = 5915)
or catid in (
    select parent_id 
    from all_categories 
    where parent_id = 5915)
4 голоса | спросил user460114 2 SunEurope/Moscow2018-12-02T00:20:38+03:00Europe/Moscow12bEurope/MoscowSun, 02 Dec 2018 00:20:38 +0300 2018, 00:20:38

6 ответов


0
Уровень 0 parent_id для ребенка хранится в таблице «all_categories».Таким образом, дочерний элемент может быть связан с другими дочерними элементами по их общему parent_id.А затем включите уровень 0 одновременно.Сложность заключается в том, что указанный дочерний идентификатор отсутствует в таблице «списки».Таким образом, чтобы получить эти записи record_id, он должен пройти через категории.Тест на rextester можно найти здесьРезультат:«Уровень» также включен в запрос, потому что его можно использовать для генерации этого дерева категорий в HTML.Обратите внимание, что запрос может быть значительно упрощен, если эта таблица «списков» будет содержать только cat_id для уровня 0
ответил LukStorms 9 SunEurope/Moscow2018-12-09T16:50:57+03:00Europe/Moscow12bEurope/MoscowSun, 09 Dec 2018 16:50:57 +0300 2018, 16:50:57
0
Предполагая, что дерево имеет максимальную глубину в четыре уровня, вы можете использовать несколько соединений LEFT JOIN для получения полного дерева или поддерева.Это не будет супер эффективным, хотя.Рассмотрим следующий запрос:Это даст такие результаты:К сожалению, он содержит только полные пути.Чтобы соответствовать ожидаемому результату, просто разбейте каждую строку на 4 строки:Демо на БД Fiddle
ответил Salman A 11 TueEurope/Moscow2018-12-11T19:01:20+03:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2018 19:01:20 +0300 2018, 19:01:20
0
У вас непонятная структура данных, но проблема не кажется такой сложной.Кажется, это делает то, что вы хотите:Идея довольно проста.Таблица ---- +: = 1 =: + ---- имеет полную иерархию.По сути, вам нужно переместить все уровни иерархии в отдельные строки, чтобы их можно было агрегировать.Это то, что делает ---- +: = 2 =: + ---- к ---- +: = 3 =: + ---- делает.Остальное просто агрегация.
ответил Gordon Linoff 15 SatEurope/Moscow2018-12-15T19:47:48+03:00Europe/Moscow12bEurope/MoscowSat, 15 Dec 2018 19:47:48 +0300 2018, 19:47:48
0
ну в mysql 8 есть функция (с), которая запускается рекурсивно, вы можете получить уровень catIdструктура -> (id cat parent_id) -> (1,24, NULL), (2,5915,1), (3,7569,2), (4,3,1)Единственным ограничением этого является то, что он находится в моем sql версии 8.x остальные код будет работать нормально, любая проблема, которую вы можете задать этот метод называется CET надеюсь, что это поможет
ответил shivam dhankani 12 WedEurope/Moscow2018-12-12T15:32:21+03:00Europe/Moscow12bEurope/MoscowWed, 12 Dec 2018 15:32:21 +0300 2018, 15:32:21
0
Для каждого record_id присоедините слева дочерние элементы, затем подсчитайте уникальные значения на каждом уровне и сложите их вместе.
ответил Paul X 13 ThuEurope/Moscow2018-12-13T22:29:59+03:00Europe/Moscow12bEurope/MoscowThu, 13 Dec 2018 22:29:59 +0300 2018, 22:29:59
0
Я считаю, что это подходит для рекурсивного SQL.
ответил Indominus 16 SunEurope/Moscow2018-12-16T13:12:05+03:00Europe/Moscow12bEurope/MoscowSun, 16 Dec 2018 13:12:05 +0300 2018, 13:12:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132