MySQL bir alt sorgu içinde ana sorgu alanını belirtmek için?

4 Cevap php

Is there a way to specify the parent query field from within a subquery in mySQL?

For Example:
I have written a basic Bulletin Board type program in PHP.

Veritabanındaki her mesaja içerir: id (PK) ve parent_id (üst yazının id). Sonrası bir ebeveyn kendisi ise, o zaman onun parent_id 0'a ayarlanır.

Her ebeveyn yazı ve ebeveyn sahip olduğu çocuk sayısını bulabilirsiniz mySQL sorgu yazmaya çalışıyorum.

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

Zor kısmı ilk id dışında alt sorgunun olduğunu id ikinci atıfta gerektiğini bilmiyor olmasıdır. Ben id_tmp AS SELECT id yapmak ve daha sonra alt sorgu içinde başvurabilirsiniz biliyorum, ama aynı zamanda id dönmek ve sütun adı olarak "id" tutmak istiyorsanız, o zaman, o zaman ben döndüren bir sorgu yapmak olurdu Aynı veri ile bana 2 sütun (bana dağınık görünüyor)

$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";

Dağınık yolu çalışıyor, ama ben bu yüzden ben soru göndermek düşündüm buraya bir şeyler öğrenmek için bir fırsat hissediyorum.

4 Cevap

Nasıl hakkında:

$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";

Masalar benzersiz bir ad verin:

$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";

Sen böyle bir şey deneyebilirsiniz

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

Geri Örnek almak için, alias seçin alt ana tablo kullanın

SELECT  pt.id,
        (SELECT COUNT(1) FROM post_table WHERE parent_id = pt.id) 
FROM    post_table pt
WHERE   pt.parent_id = 0

The following syntax works in Oracle. Can you test if the same works in MYSQL too? It is called scalar subquery in Oracle.

Iki kez aynı tablo kullanıyorsanız, sadece onları ayırt etmek için farklı iki tablo diğer ad gerekir.

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