我想获得一个人的所有工作,并计算他收到的所有出价,这些出价存储在另一张表中。
我有一个包含以下行的表:
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();
如何使用一个查询执行此操作?
答案 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