За последние 24 часа нас посетили 22604 программиста и 1278 роботов. Сейчас ищут 749 программистов ...

[HELP] Помогите решить запрос

Тема в разделе "PHP и базы данных", создана пользователем S.t.A.M., 20 окт 2020.

  1. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Есть таблица со стандартной иерархией id и parent_id

    Нужно получить все записи у которых больше двух подчиненных записи (детей)

    Код (Text):
    1.  
    2. id | parent_id | data
    3. 1  | 0         |
    4. 2  | 1         |
    5. 3  | 1         |
    6. 4  | 1         |
    7. 5  | 2         |
    8. 6  | 2         |
    9. 7  | 3         |
    10. 8  | 3         |
    11. 9  | 3         |

    Нужно ОДНИМ SQL-запросом получить выборку в которой только 1 и 3
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Приведите пример полученной выборки.
     
  3. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Код (Text):
    1. |1|
    2. |3|
    --- Добавлено ---
    Придумал решение, но не уверен, что оно оптимальное:
    Код (Text):
    1. SELECT parent_id, num FROM (SELECT parent_id,COUNT(*) AS num FROM `table` GROUP by parent_id) t WHERE num > 2
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не совсем понятно что имеется в виду под parent_id = 0
    И в чем решение.
    Оно дает на выходе все ветки?
     
  5. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    то что у id1 нет родителя
    Все записи у которых больше двух подчиненных записи (детей), в данном примере это записи c ID1 и ID3
     
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Понятно.
    Нормальное решение.
    Смутила parent_id, это немного из другой оперы. Но, название можете, конечно, давать любое.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Решение нормальное. Можно ещё использовать HAVING
    Код (SQL):
    1. SELECT parent_id, COUNT(*) AS num
    2. FROM `table`
    3. GROUP BY parent_id
    4. HAVING COUNT(*) > 2
     
  8. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Для вывода многоуровневых категорий(например разделов магазинов, или жанров библиотек) лучше использовать json, или xml. А то и txt.
    Перезаписывая их только при изменении структуры.
     
  9. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    чем это лучше то?
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Я не понимаю таких радикальных заявлений. Бывают случаи, когда осознанная денормализация выгодна. Но просто заявить "да ну нафиг вашу реляционную БД, json решает всё" - это несеръёзно. Где обоснование?
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    А для езды на мотоцикле лучше использовать шлем. Внимательно прочитайте, что нужно ТСу, и больше не оффтопьте.
    --- Добавлено ---
    Это именно из этой оперы. Список смежности (список смежных вершин) называется, если не в курсе.
     
  12. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Элементарно.
    Список понятен "невооруженным" взглядом. И может быть отредактирован рядовым менеджером по продажам.
    В любой, самый неудобный момент.

    Не совсем. Вывод такого списка из нескольких десятков, сотен тысяч смежностей (например книжные серии с зависимостями) не то же самое, что вывести два десятка разделов интернет-магазина.
    --- Добавлено ---
    Раздражаю?
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Если на то пошло, менеджеру неудобно редактировать JSON :) Это дело программистов и дизайнеров как представить структуру на фронте, скрывая технические детали от пользователя.
     
  14. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Я согласен, что вопрос спорный, но и не вижу преимуществ вашей точки зрения.
    На этом и предлагаю закруглить.
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Мать честная. :eek:

    Нет. Просто не оффтопьте.
     
    #15 miketomlin, 20 окт 2020
    Последнее редактирование: 20 окт 2020
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Если бы это была моя т.з., а то это обычный подход для бекенда с реляционной БД. :)
    "Для вывода ... лучше..." это подход фронтедера. Загруглиться можно на том, что API может использовать JSON. Глубже фронтендеру лезть не надо.