MySQL双左连接、条件或组

MySQL双左连接、条件或组,mysql,group-by,left-join,Mysql,Group By,Left Join,我有点问题。 我试着数一数分类和子分类中的所有文章 我使用这个查询: SELECT cat.*, COUNT(art.id) AS total FROM article_categories cat LEFT JOIN article_categories c2 ON (c2.category_parent = cat.category_id) LEFT JOIN articles art ON (art.cid = cat.ca

我有点问题。 我试着数一数分类和子分类中的所有文章

我使用这个查询:

SELECT 
    cat.*, COUNT(art.id) AS total
FROM
    article_categories cat
        LEFT JOIN
    article_categories c2 ON (c2.category_parent = cat.category_id)
        LEFT JOIN
    articles art ON (art.cid = cat.category_id
        OR art.cid = c2.category_id)
WHERE
    cat.category_parent = 0 AND art.st = 1
        AND IF(art.cid IN (2 , 4, 16, 17, 18, 19, 20, 21, 22),
        TO_DAYS(CURDATE()) - TO_DAYS(art.date_edit) < 120,
        art.cid)
GROUP BY IF(c2.category_parent > 0,
    c2.category_parent,
    cat.category_id)
ORDER BY cat.category_order ASC
SELECT 
    *
FROM
    `articles`
WHERE
    st = 1
        AND cid IN (2 , 4, 16, 17, 18, 19, 20, 21, 22)
        AND IF(cid IN (2 , 4, 16, 17, 18, 19, 20, 21, 22),
        TO_DAYS(CURDATE()) - TO_DAYS(date_edit) < 120,
        cid)
谢谢你的帮助

[编辑]

$sql1 = "SELECT cat.*, COUNT(art.id) AS total FROM article_categories cat LEFT JOIN articles art ON (art.cid = cat.category_id) WHERE cat.category_parent = 0 AND IF(art.cid IN (2 , 4, 16, 17, 18, 19, 20, 21, 22), TO_DAYS(CURDATE()) - TO_DAYS(art.date_edit) < 120, art.cid) GROUP BY art.cid";

$category = array();
foreach ($row as $cat) {
    $total = $cat['total'];
    $sql2 = "SELECT cat.*, COUNT(art.id) AS total FROM article_categories cat LEFT JOIN articles art ON (art.cid = cat.category_id) WHERE cat.category_parent = ".$cat['category_id']." AND IF(art.cid IN (2 , 4, 16, 17, 18, 19, 20, 21, 22), TO_DAYS(CURDATE()) - TO_DAYS(art.date_edit) < 120, art.cid) GROUP BY art.cid";
    foreach ($row2 as $cat2) {
        $total += $cat2['total'];
    }
    $category[] = array('category_id'=> $cat['category_id'], 'total' => $total);
}
$sql1=“选择cat.*,将(art.id)计算为从文章类别cat LEFT加入文章艺术ON(art.cid=cat.category\u id)的总数,其中cat.category\u parent=0,如果(art.cid在(2,4,16,17,18,19,20,21,22)到(CURDATE())-到(art.date\u edit)<120,art.cid)按art.cid分组”;
$category=array();
foreach(行作为$cat){
$total=$cat['total'];
$sql2=“选择cat.*,将(art.id)作为从文章类别cat LEFT JOIN articles art ON(art.cid=cat.category_id)中的总计,其中cat.category_parent=“.cat['category_id']”和IF(art.cid在(2,4,16,17,18,19,20,21,22)中)到_DAYS(CURDATE())-到_DAYS(art.date_edit)<120,art.cid)按art.cid分组”;
foreach($2行作为$2类){
$total+=$cat2['total'];
}
$category[]=数组('category\u id'=>$cat['category\u id'],'total'=>$total);
}

我创建了另一个表:article\u categories\u rel

article_categories_rel
- child_id
- parent_id
我自己的新查询:

SELECT
    cat.*,
    COUNT(art.id) as ilosc
FROM
    article_categories cat
LEFT JOIN
    article_categories_rel acr
    ON
        (cat.category_id=acr.parent_id)
LEFT JOIN
    articles art
    ON (
        art.cid = acr.child_id AND
        art.st=1 AND
        if(art.cid in(2,4,16,17,18,19,20,21,22),
        TO_DAYS( curdate( ) ) - TO_DAYS( art.date_edit )<120,
        art.cid)
    )
WHERE
    cat.category_parent=0
GROUP BY
    cat.category_id
ORDER BY
    cat.category_order ASC;
选择
猫*,
将(艺术id)计算为ilosc
从…起
第11条类别
左连接
第条(类别)相关acr
在…上
(类别识别号=acr.父类识别号)
左连接
文章艺术
在(
art.cid=acr.child\u id和
第st条=1和
如果(2,4,16,17,18,19,20,21,22)中的第cid条,

TO_DAYS(curdate())-TO_DAYS(art.date_edit)您期望什么以及为什么?我想显示主要类别,并用文章(包含子类别中的所有文章)计算它们您的问题是什么?您是否期望得到不同的结果?问题是,对某些类别的第一次查询计数为36355条记录,但应计数为7730条记录。请您解释一下为什么期望得到此结果?
SELECT
    cat.*,
    COUNT(art.id) as ilosc
FROM
    article_categories cat
LEFT JOIN
    article_categories_rel acr
    ON
        (cat.category_id=acr.parent_id)
LEFT JOIN
    articles art
    ON (
        art.cid = acr.child_id AND
        art.st=1 AND
        if(art.cid in(2,4,16,17,18,19,20,21,22),
        TO_DAYS( curdate( ) ) - TO_DAYS( art.date_edit )<120,
        art.cid)
    )
WHERE
    cat.category_parent=0
GROUP BY
    cat.category_id
ORDER BY
    cat.category_order ASC;