如何在同一SQL查询期间计算来自不同表的行

时间:2017-02-07 19:32:23

标签: php mysql union

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

我有一个包含以下行的表: table jobs: jobId,userid,title

另外一张表格如下: table bids: jobId,amount

现在我想从第一个表jobs WHERE userid=1获取所有作业,并将其与计算第二个表table bids中每个作业具有相同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();

如何使用一个查询执行此操作?

2 个答案:

答案 0 :(得分:1)

您可以使用

加入计数和分组
     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

答案 1 :(得分:1)

你可以模仿当前的错误方式"单个查询中的方法,使用SELECT列表中的相关子查询,因此您只需要一个查询:

 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

将为外部查询返回的每一行执行相关子查询。如果外部查询返回大量行,则此方法会变得昂贵。

如果jobs表中有一列(或一组列)是UNIQUE,我们可以使用OUTER JOIN操作和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