SQL-запрос для выбора дочерних и родительских элементов

У меня есть таблица mysql «taxonomy_term_hierarchy» с двумя полями.

tid -- Первичный ключ: taxonomy_term_data.tid термина.
parent -- Первичный ключ: taxonomy_term_data.tid родителя термина. 0 указывает на отсутствие родителя.

Мне нужно получить дочерние термины 1 уровня для некоторого термина, но если у него нет дочерних элементов, то получить дочерние элементы для него родитель. Что-то типа:

SELECT down.tid FROM taxonomy_term_hierarchy down WHERE down.parent=60
IF ( COUNT(down.tid) = 0 ) THEN
   SELECT current.tid FROM taxonomy_term_hierarchy current 
   WHERE current.parent=
        (SELECT its.parent FROM taxonomy_term_hierarchy its
         WHERE its.tid=60)

Могу ли я сделать это в одном запросе?


person user1809655    schedule 02.03.2014    source источник


Ответы (1)


К сожалению, я не думаю, что это возможно с одним запросом, потому что вам нужен оператор IF, чтобы определить, какой запрос использовать. Однако вы можете создать хранимую процедуру для обработки логики и вызвать ее, передав ей tid. Вот хранимая процедура, которую я создал:

CREATE PROCEDURE getChildren(in _tid int)
BEGIN

  DECLARE hasChildren BIT;

  SET hasChildren = EXISTS (
    SELECT ''
    FROM taxonomy_term_hierarchy tth
    WHERE tth.parent = _tid
  );

  IF hasChildren THEN
    BEGIN
      SELECT tid, parent
      FROM taxonomy_term_hierarchy
      WHERE parent = _tid;
    END;
  ELSE
    BEGIN
      SELECT tth3.tid, tth3.parent
      FROM taxonomy_term_hierarchy tth1
        INNER JOIN taxonomy_term_hierarchy tth2 ON tth1.parent = tth2.tid
        INNER JOIN taxonomy_term_hierarchy tth3 ON tth2.tid = tth3.parent
      WHERE tth1.tid = _tid;
    END;
  END IF;

END//

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

person jtate    schedule 03.03.2014
comment
Большой! Это очень помогает. - person user1809655; 03.03.2014