Php 如何在同一SQL查询期间统计不同表中的行

Php 如何在同一SQL查询期间统计不同表中的行,php,mysql,union,Php,Mysql,Union,我想为一个人获得所有的工作,并计算他收到的所有出价,这些出价存储在不同的表中 我有一个包含以下行的表: 表格作业:作业ID、用户ID、标题 和一个不同的表,其中包含以下内容: 表格投标:作业ID、金额 现在我想从第一个表中获取所有作业,其中userid=1并将其与计算第二个表中的所有行相结合,这些行对于从第一个表中找到的每个作业(行)具有相同的jobId 可能的输出可以是: job.jobId job.userid job.title bids.Total

我想为一个人获得所有的工作,并计算他收到的所有出价,这些出价存储在不同的表中

我有一个包含以下行的表:
表格作业:作业ID、用户ID、标题

和一个不同的表,其中包含以下内容:
表格投标:作业ID、金额

现在我想从第一个表中获取所有作业,其中userid=1并将其与计算第二个表中的所有行相结合,这些行对于从第一个表中找到的每个作业(行)具有相同的
jobId

可能的输出可以是:

job.jobId        job.userid       job.title       bids.Total
 1                  10            "My job"            20
 2                  11            "Other job"         5 
我知道如何用错误的方法来做,就像这样:

$stmt0 = $mysqli->stmt_init();
$stmt0->prepare("SELECT jobId,title FROM jobs WHERE userid=?");
$stmt0->bind_param('i', $userid);
$stmt0->execute();
$stmt0->bind_result($jobId,$title);

// Fetch the result of the query
while($stmt0->fetch()) { 

$ary = "SELECT amount FROM bids WHERE jobId='$jobId'";
if ($stmt_1 = mysqli_prepare($mysqli, $ary)) {
    mysqli_stmt_execute($stmt_1);
    mysqli_stmt_store_result($stmt_1);
    $total_bids = mysqli_stmt_num_rows($stmt_1);
    mysqli_stmt_close($stmt_1);
}

// show all jobs with total bids
...

 }


$stmt0->close();

如何通过一个查询来实现这一点?

您可以使用连接计数和分组方式

     SELECT a.jobId,a.userid, a.title, count(b.jobid) as bidsTotal 
     FROM jobs as a
     inner join bids as b on b.jobId = a.JobId
     WHERE userid=?
     Group by  a.jobId,a.userid, a.title

您可以在单个查询中模拟当前的“错误方式”方法,在选择列表中使用相关子查询,这样您就只有一个查询:

 SELECT j.jobId
      , j.title
      , j.userid
      , ( SELECT COUNT(*) 
            FROM bids b 
           WHERE b.jobId = j.jobId
        ) AS cnt_bids
   FROM jobs j
  WHERE j.userid = ?
  ORDER BY j.jobId
将对外部查询返回的每一行执行相关子查询。如果外部查询返回大量的行,这种方法会变得昂贵

如果在
作业
表中有一列(或一组列)是唯一的,我们可以使用外部联接操作和GROUP BY获得等效的结果

如果我们保证
jobId
jobs
表中是唯一的,则可以使用外部联接操作获得等效结果

 SELECT j.jobId
      , j.title
      , j.userid
      , COUNT(b.jobId) AS cnt_bids
   FROM jobs j
   LEFT
   JOIN bids b
     ON b.jobId = j.jobId
  WHERE j.userid = ?
 GROUP BY j.jobId, j.title, j.userid 
 ORDER BY j.jobId

也许<代码>选择jobs.jobId、job.user_id、job.title、sum(bids.Total)'bids'从作业内部加入bids.jobId=jobs.jobId,其中job.user_id=?按作业分组。jobId谢谢,看起来比我想象的要容易!我实际上注意到一个问题,如果他们没有出价,它将始终返回1。有什么解决方案吗?找到了,改为count(b.jobId)@Nicolas:查询需要使用外部连接才能返回零计数。内部联接将仅返回来自
作业
的行,其中
bids
中有匹配行,并且
b.jobId
上的相等谓词(条件)将保证
b.jobId
不会为空。。。此查询返回“零”计数的唯一方法是将内部联接更改为外部联接。谢谢!第二种方法是使用外部联接(
左联接
)和聚合(
计数
)执行第二种方法,当我们有一列(或一组列)保证是唯一的时,聚合(
计数
)将起作用,因此我们可以指定一个
分组方式
操作。(当
出价中没有匹配行时,外部联接将允许我们返回零计数。如果我们没有唯一性保证(更一般的情况),那么我们可以返回相关子查询以返回指定的结果。(就性能而言,如果有合适的索引,这两种方法都将受益。)