簡體   English   中英

如何在同一 SQL 查詢期間計算不同表中的行數

[英]How to count rows from a different table during same SQL query

我想獲得一個人的所有工作,並計算他收到的所有出價,這些出價存儲在不同的表中。

我有一個包含以下行的table jobs: jobId,userid,titletable 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();

我怎樣才能用一個查詢來做到這一點?

您可以使用 Join a count and group by

     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 列表中的相關子查詢,因此您將只有一個查詢:

 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 獲得等效的結果。

如果我們保證jobIdjobs表中是UNIQUE,則可以使用外連接操作獲得等效的結果

 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM