Php 语句对其他表上的(*)相关行进行计数

Php 语句对其他表上的(*)相关行进行计数,php,mysql,sql,database,Php,Mysql,Sql,Database,我有两个名为患者列表和牙医列表的表格,其中牙医可以有很多患者,我想知道牙医有多少患者,然后订购 我这里有一个示例代码,可以从中获取医生的每位患者: $query_dentist = "SELECT * FROM dentist_list ORDER BY ID ASC"; $res_dentist = mysql_query($query_dentist); if ($res_dentist) { while ($row_dentist = mysql_fetch_array($r

我有两个名为
患者列表
牙医列表
的表格,其中牙医可以有很多患者,我想知道牙医有多少患者,然后订购

我这里有一个示例代码,可以从中获取医生的每位患者:

$query_dentist = "SELECT * FROM dentist_list ORDER BY ID ASC";
$res_dentist   = mysql_query($query_dentist);

if ($res_dentist) {
    while ($row_dentist = mysql_fetch_array($res_dentist)) {

    }
}
获取所有牙医后,我在while中创建一个新的查询,从中获取所有患者计数

$dentist_id = $row_dentist['id'];
$query_patient= "SELECT COUNT(*) as patient_num FROM patient_list
                                 WHERE dentist_id ='$dentist_id'";

$res_patient=mysql_query($query_patient);
if($res_patient)
{
     while($row_patient=mysql_fetch_array($res_patient))
     {

     }
 }
例如,查询的输出为:

doctor 1 has 10 patient
doctor 2 has 5 patient
doctor 3 has 100 patient

可以使用MySQL语句代替PHP吗?我将创建一个查询,因为我需要它按患者数量排序。

您可以尝试使用以下代码:

SELECT COUNT(*) AS Patient_Num FROM patient_list GROUP BY dentist_id ORDER BY 1
  select d.Name, -- <- put dentist information here
         (select count(1) from patient_list p where p.dentist_id = d.dentist_id) 
    from dentist_list d
order by 2 asc -- <- order by by the 2nd field that is (select count(1...

选择d.名称,--使用GROUP BY语句在两个表之间使用GROUPBY和JOIN,这样可以减少两个查询和循环时间。更好的做法是在牙医列表表中包含字段patient_count。并在添加/编辑/删除患者时进行更新。这样,您就不必运行额外的查询,因为您将拥有相应牙医的患者计数。因为当你有成千上万的牙医和医生时,额外的分组查询会降低页面速度patients@nedstark好的索引将解决速度问题。。。无需在此处反规范化数据库。再次。。。如果有一个医生没有病人怎么办?:阿尔伯特·达拉坎(albert Daracan)写了一个类似“按2 asc订购”的代码——订购间隔条款,而不是菲德尔的号码(见我的编辑),这只是我的习惯;根本原因是count(field)只计算非空值;1不能为空,而*技术上可以(当记录中的所有字段都为空时)。当然,在99.9999%的情况下,我们可以使用count(*)而不是count(1)如何将牙医的人数计算为0。。和一名或多名患者的牙医。。我将如何质疑这一点