Группировка с parent ID

pilot911

Новичок
Группировка с parent ID

Не могу решить задачу:

есть таблица с полями ID, PID, TITLE

необходимо вывести все строки, но чтобы у каждой было дополнительное поле, в котором бы указывалось, сколько с таким же PID строк

что-то дописать в запрос
PHP:
SELECT 
      id, pid, title
FROM 
    pages
чтобы выводило
PHP:
ID  PID  TITLE     TOTAL WITH SAME PID
1    0     title1             2
2    0     title2             2
3    1     title3             1
4    2     title4             3
5    2     title5             3
6    2     title6             3
 

pilot911

Новичок
что-то не получается

PHP:
SELECT 
     t1.id, t1.title, t1.pid, count(t2.pid) as total
FROM 
     pages AS t1 
INNER JOIN 
     pages AS t2 
ON 
     t1.id = t2.id
GROUP BY 
     t2.pid;
выводит по одной записи для каждого уникального PID


PHP:
ID  PID  TITLE     TOTAL WITH SAME PID
1    0     title1             2
3    1     title3             1
4    2     title4             3

получилось вот так, но может есть вариант попроще ?

PHP:
SELECT 
      id, pid, title, count_pid 
FROM 
    pages, (
          SELECT 
                pid AS _pid, count(pid) AS count_pid 
          FROM 
                pages 
          GROUP BY pid
          ) AS _tbl 
WHERE pages.pid = _tbl._pid;
 

yaniks

новичок
попробуй еще раз свой первый вариант, но присоединяй по pid а сгрупируй по id
 
[sql]SELECT t1.id AS id, t1.title AS title, t1.pid AS pid, count(t2.pid) as count
FROM pages AS t1
LEFT JOIN pages AS t2
ON t1.pid = t2.pid
GROUP BY t1.id;[/sql]
 

pilot911

Новичок
работает отменно, спасибо большое!

-~{}~ 14.11.08 14:04:

можно немножно раскрыть механизм ?

мы берем одну строку таблицы t1 и к ней присоединяем полей count, найденное по условию ON t1.pid = t2.pid?
 
zerkms
Покаюсь в своем незнании. :( Сколько ни читал мануалы - так и не смог понять реальную разницу между LEFT, RIGHT и INNER... Всегда использовал LEFT JOIN - вроде тормозов не было. Если не сложно объясните, плз, или дайте линк где разница между ними ясно описана...
 

Wicked

Новичок
Loshadka
при выборе A left join B on (A.id = B.id), если будет найдена запись в таблице A, но для нее не будет найдено записей B, то запись A все равно попадет в RS. А при иннер джоине - не попадет.
 
Wicked
а... Понял - огромное спасибо. :)
FROM t1 INNER JOIN t2 - получается аналог "FROM t1, t2"
 
Сверху