[英]How to construct a SQL query to fetch different columns from same table in different rows?
[英]How to count rows from a different table during same SQL query
我想獲得一個人的所有工作,並計算他收到的所有出價,這些出價存儲在不同的表中。
我有一個包含以下行的table jobs: jobId,userid,title
: 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();
我怎樣才能用一個查詢來做到這一點?
您可以使用 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 獲得等效的結果。
如果我們保證jobId
在jobs
表中是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.