Существует ли способ указать родительское поле запроса из подзапроса в 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";
Грязный путь хорошо работает, но я чувствую возможность изучить что-то здесь, таким образом, я думал, что отправлю вопрос.
Как насчет:
$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";
Назовите таблицам уникальные имена:
$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";
Вы можете попробовать что-нибудь подобное
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
Следующий синтаксис работает в 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