带条件的ORDER BY COUNT


ORDER BY COUNT with condition

我有两个表,usersclients_closed_1

我需要根据表client_closed_1中meeting=1的行数对结果进行排序。

我为time_closed字段做了这件事,但这很容易,因为没有条件。

这是搜索代码的一部分,所以我会向您展示所有内容。有了这段代码,我可以按会议进行排序,但没有meeting=1行的用户不会从数据库中退出,我需要他们显示,即使他们没有会议。

if (project_type($_GET['project']) == 1)    {
    $table = 'clients_closed_1';
}   else    {
    $table = 'clients_closed_2';
}
    $s_query = "SELECT *,COUNT(time_closed) as numc FROM `".$table."` FULL JOIN `users` ON users.ID=user_c WHERE 1=1";
    if (isset($_POST['search']))    {   
        if ($_POST['tm'] == 'da')   {
                $dd = strtotime($_POST['y']."-".$_POST['m']."-".$_POST['d']);
                $s_query = $s_query." && DATE(FROM_UNIXTIME(time_closed)) = DATE(FROM_UNIXTIME(".$dd."))";
        }   
        elseif ($_POST['tm'] == 'mon')  {
            $s_query = $s_query." && YEAR(FROM_UNIXTIME(time_closed))=".$_POST['y']." && MONTH(FROM_UNIXTIME(time_closed))=".$_POST['m'];
        }
        if (!empty($_POST['search_name']))  {
            $s_query = $s_query." && CONCAT(p_name,' ',l_name) LIKE '%".$_POST['search_name']."%'";
        }
        if (!empty($_POST['level']))    {
            $query = "&& (level=3 && project IN (SELECT `project` FROM `project` WHERE type='2')) || level=4";
        }
    }   else    {
        $s_query = $s_query." && YEAR(FROM_UNIXTIME(time_closed))=YEAR(NOW()) && MONTH(FROM_UNIXTIME(time_closed))=MONTH(NOW())";
    }
if (isset($_GET['order']))  {
    if ($_GET['order'] == 'closing')    {
        $s_query = $s_query." GROUP BY users.ID ORDER BY numc DESC";
    }
    elseif ($_GET['order'] == 'meeting')    {
        $s_query = $s_query." && meeting='1' GROUP BY users.ID ORDER BY numd DESC";
    }
}
$query = $db->query($s_query);

如果你需要更多的代码/不理解某些内容,请评论,我会修复它。

谢谢。

编辑:$s_query:示例

   SELECT *,COUNT(time_closed) as numc, COUNT(meeting) as numd FROM `clients_closed_1`
   FULL JOIN `users` ON users.ID=user_c WHERE 1=1 && 
    YEAR(FROM_UNIXTIME(time_closed))=YEAR(NOW()) && 
    MONTH(FROM_UNIXTIME(time_closed))=MONTH(NOW()) 
    GROUP BY users.ID ORDER BY numc DESC

我不确定我是否100%理解您想要的条件,但以下是查询的粗略草稿:

SELECT c.id, c.meeting, temp1.time_closed_count, temp2.meeting_count, temp3.status_count
FROM `clients_closed_1` c
FULL JOIN `users` u
ON c.user_c=u.ID 
LEFT JOIN (SELECT time_closed, count(time_closed) time_closed_count FROM clients_closed_1 GROUP BY time_closed) temp1
ON c.time_closed = temp1.time_closed
LEFT JOIN (SELECT meeting, count(meeting) meeting_count FROM clients_closed_1 GROUP BY meeting) temp2
ON c.meeting = temp2.meeting
LEFT JOIN (SELECT status, count(status) status_count FROM clients_closed_1 GROUP BY status) temp3
ON c.status = temp3.status
WHERE 1=1 
AND YEAR(FROM_UNIXTIME(time_closed))=YEAR(NOW()) 
AND MONTH(FROM_UNIXTIME(time_closed))=MONTH(NOW()) 
ORDER BY {$order_criteria} DESC

这里发生的事情是,我们正在对子查询中所有不同的会议值进行计数,并根据每行的"会议"值将其连接到原始查询。

这为我们提供了按不同会议值分组的总"会议",而不需要剪切行。对于其他2个子查询也是如此。

这也清理了一些东西,并允许我们只插入$order_criteria,其中可以是time_closed count、meeting_count或status_count。只需设置一个默认(id(,以防用户没有选择任何内容:(

编辑:我还建议你试着改掉SELECT *的习惯。指定您需要的列,您的输出会更好。当您开始处理较大的表时,它的效率也会高得多。

在我写了一个很长的查询之后,我找到了完美的灵魂。

SELECT SUM(IF(meeting='1' && user_c=users.ID, 1,0)) as meeting_count FROM clients_closed_1 JOIN users

此查询以meeting_count的形式返回其值为"1"的会议次数。

直到现在我才知道我能做这样的事情,所以我在这里分享了它。我想这对将来会有帮助。