Как указать родительское поле запроса из подзапроса в MySQL?

Существует ли способ указать родительское поле запроса из подзапроса в MySQL?

Например:
Я записал основную программу типа Доски объявлений в PHP.

В базе данных каждое сообщение содержит: идентификатор (PK) и parent_id (идентификатор родительского сообщения). Если сообщение является самостоятельно родителем, то его parent_id установлен на 0.

Я пытаюсь записать запрос MySQL, который найдет каждое родительское сообщение и число детей, которых имеет родитель.

$query = "SELECT id, (
      SELECT COUNT(1) 
      FROM post_table 
      WHERE parent_id = id
) as num_children
FROM post_table
WHERE parent_id = 0";

Хитрая часть - то, что первый идентификатор не знает, что должен обращаться к второму идентификатору, который является за пределами подзапроса. Я знаю, что могу сделать ИЗБРАННЫЙ идентификатор AS id_tmp и затем обратиться к нему в подзапросе, но затем если бы я хочу также возвратить идентификатор и сохранить "идентификатор" как имя столбца, затем я должен был бы сделать запрос, который возвращает меня 2 столбца с теми же данными (который кажется грязным мне),

$query = "SELECT id, id AS id_tmp, 
            (SELECT COUNT(1)
            FROM post_table
            WHERE parent_id = id_tmp) as num_children
         FROM post_table
         WHERE parent_id = 0";

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

49
задан omar 14 February 2015 в 15:10
поделиться

4 ответа

Как насчет:

$query = "SELECT p1.id, 
                 (SELECT COUNT(1) 
                    FROM post_table p2 
                   WHERE p2.parent_id = p1.id) as num_children
            FROM post_table p1
           WHERE p1.parent_id = 0";

или, если вы ставите псевдоним на p1.id, вы можете сказать:

$query = "SELECT p1.id as p1_id, 
                 (SELECT COUNT(1) 
                    FROM post_table p2 
                   WHERE p2.parent_id = p1.id) as num_children
            FROM post_table p1
           WHERE p1.parent_id = 0";
69
ответ дан 7 November 2019 в 11:48
поделиться

Назовите таблицам уникальные имена:

$query = "SELECT a.id, (SELECT COUNT(1) FROM post_table b WHERE parent_id = a.id) as num_children FROM post_table a WHERE a.parent_id = 0";
2
ответ дан 7 November 2019 в 11:48
поделиться

Вы можете попробовать что-нибудь подобное

SELECT  pt.id,
        CountTable.Cnt
FROM    post_table pt LEFT JOIN
        (
            SELECT  parent_id,
                    COUNT(1) Cnt
            FROM    post_table
            WHERE   parent_id <> 0
            GROUP BY parent_id
        ) CountTable ON pt.id = CountTable.parent_id
WHERE   pt.parent_id = 0

Чтобы вернуться к вашему примеру, используйте псевдоним основной таблицы в sub select

SELECT  pt.id,
        (SELECT COUNT(1) FROM post_table WHERE parent_id = pt.id) 
FROM    post_table pt
WHERE   pt.parent_id = 0
4
ответ дан 7 November 2019 в 11:48
поделиться

Следующий синтаксис работает в Oracle. Можете ли вы проверить, работает ли тот же самый синтаксис и в MYSQL? В Oracle это называется скалярным подзапросом.

Для того, чтобы отличить две таблицы друг от друга, достаточно просто использовать разные псевдонимы, если вы используете одну и ту же таблицу дважды.

sql> select empno,
  2         (select dname from dept where deptno = emp.deptno) dname
  3    from emp 
  4    where empno = 7369;

     EMPNO DNAME
---------- --------------
      7369 RESEARCH

sql> select parent.empno,
  2         (select mgr from emp where empno = parent.empno) mgr
  3    from emp parent
  4    where empno = 7876;

     EMPNO        MGR
---------- ----------
      7876       7788
0
ответ дан 7 November 2019 в 11:48
поделиться
Другие вопросы по тегам:

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