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
不会为空。。。此查询返回“零”计数的唯一方法是将内部联接更改为外部联接。谢谢!第二种方法是使用外部联接(左联接
)和聚合(计数
)执行第二种方法,当我们有一列(或一组列)保证是唯一的时,聚合(计数
)将起作用,因此我们可以指定一个分组方式
操作。(当出价中没有匹配行时,外部联接将允许我们返回零计数。如果我们没有唯一性保证(更一般的情况),那么我们可以返回相关子查询以返回指定的结果。(就性能而言,如果有合适的索引,这两种方法都将受益。)