艰难的mysql嵌套表结果挑战

时间:2012-06-18 10:41:18

标签: mysql nested

我正在搞乱wordpress为我的插件制作一个jquery用来填充表格的API。需要帮助弄清楚我将如何做到这一点。

首先查询,这将获得'父'帖子:

[Q1]: Select * from posts as p where p.ID IN ({SomeIDs I am requesting})

第二个查询,这将获得第一个孩子:

[Q2]: Select * from posts as p where p.parent_postID IN ({the parentIDs from q1})

如何运行此查询以使结果为一个输出。我不想每次想要显示子项时都继续运行第二个查询(子项显示为默认值,这个想法是我可以限制第一个查询)。

最终结果:

_________________________________________________
| ID   | post_parent | title      | disruption  |
-------------------------------------------------
| 894  |           0 | main title | main disc   |
| 898  |         894 | diff title | diff disc   |
| 907  |         894 | diff tilte | diff disc   |
| 910  |           0 | Main title | main disc   |
| 916  |         910 | diff title | diff disc   |
| 919  |           0 | Main title | Main disc   | 
-------------------------------------------------

您会注意到ID 919没有孩子,我仍然希望它显示在结果中。

所以我尝试加入,我会丢失没有ID = post_parentID的记录,除非我可以做其他类型的连接......

q1上的想法是'LIMIT',组合结果用q2排序,然后在制作表时jQuerys forloop的结果只会改变<TR>的bg,如果ID和post_parent匹配的话

这是我必须使用的方案...... Wordpress的;也不是说在q2中我会想要展示哪些孩子的额外标准。例。我将为孩子们添加一个post_meta .... meta_key ='lang_i18N'meta_value ='en'所以我可以为q2添加一个连接到postmeta

更新:

这是q1:

[Q1]


    SELECT
        posts.ID AS myItem_ID,
        posts.post_parent AS parentID,
        posts.post_title AS title,
        posts.post_content AS fullDesc,
        posts.post_excerpt AS shortDesc,
        posts.post_status AS status,
        posts.menu_order AS fetured_Order,
        json_meta.meta_value AS json_input,
        meta.meta_value AS vendorID,
        vendor.post_title AS vendorName,
        posts.post_modified AS modifiedDate
    FROM wp_posts AS posts
    LEFT JOIN wp_postmeta AS meta
        ON meta.post_id = posts.ID
    LEFT JOIN wp_postmeta AS json_meta
        ON json_meta.post_id = posts.ID
    LEFT JOIN wp_postmeta AS i18N
        ON i18N.post_id = posts.ID
    LEFT JOIN wp_posts AS vendor
        ON vendor.ID = meta.meta_value
    WHERE meta.meta_key = 'agency'
    AND json_meta.meta_key = 'json_input'
    AND posts.post_type = 'activity_item'
    AND posts.post_status = 'publish' 
    AND posts.ID IN (1080, 1231, 1273, 1882, 1937)
    LIMIT 0,2

确定这给了我父母列表...现在我想要包含与q1相同的孩子但是我想要i18N = 'es'意思我希望父母是i18N的任何值字段,但是我想要那些'es'的孩子,也许有4个孩子,我希望LIMIT只显示2个父母,然而他们有多少孩子(不限制孩子)可以在一个查询中完成吗?我试图远离PHP只是因为它有很多数据。

2 个答案:

答案 0 :(得分:1)

如果你想在php中使用递归函数来获取父行的所有嵌套子行,那么可以使用下面的一行: -

function get_categories_subcategories($id)
{
    $condition = isset($id)?"post_parent=".$id."":"post_parent=0";
    $sql="select id,post_parent,title,disruption from posts where ".$condition."";    

    $query=mysql_query($sql);

    $arr = array();

    if(mysql_num_rows($query))
    { 
        while($result=mysql_fetch_array($query))
        {   
         $arr[] = array(
         "id" => $result["id"],
         "post_parent" => $result["post_parent"],
         "title" => $result["title"],
         "disruption" => $result["disruption"],
         "child" => get_categories_subcategories($result["id"])
      );     
        }        
    }
    return $arr; 
}

答案 1 :(得分:0)

试试这个::

Select 
id,
if_null(post_parent_id,0)

from posts as p 

left join 

(Select parent_id from posts where id= ?/*input*/) as parent_temp_table

on (parent_temp_table.parent_id = p.postID)