2017-02-07 97 views
2

私は人のためにすべての仕事を得たいと思います。そして、彼が受け取ったすべての入札を数え、別のテーブルに保存します。同じSQLクエリ中に別のテーブルの行を数える方法

私は次の行を持つ1台持っている:今、私は最初のテーブルjobs WHERE userid=1からすべてのジョブを取得し、カウントしてこれを組み合わせたい table bids: jobId,amount

table jobs: jobId,userid,title

そして、次のと別のテーブルを第2のテーブルtable bidsのすべての行は、第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(); 

私は1つのクエリでこれを行うことができますどのように?

+0

多分... 'SELECT jobs.jobId、job.user_id、ジョブを使用することができます.title、sum(bids.Total)ジョブからの '入札' INNER JOIN入札単価bids.jobId = jobs.jobId where job.user_id =? GROUP BY jobs.jobId' –

答えて

1

あなたはあなただけのものを持っていますので、あなたは、SELECTリスト内の相関サブクエリを使用して、単一のクエリでは、現在の「間違った方法」のアプローチをエミュレートすることができ

 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 
+0

ありがとう、私は思ったよりも簡単だったようですね! –

+0

SQLではこれは頻繁に起こります...ありがとうございます。 – scaisEdge

+0

実際には1つの問題に気付きました。入札されない場合は、常に1が返されます。 –

1

により数とグループへの参加を使用することができますクエリ:

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テーブルに一意であることを保証している場合は、同等の結果が外部結合操作

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 
+0

ありがとう! 2番目のオプションは、仕事をしました –

+0

2番目のアプローチは、外部結合(LEFT JOIN')と集約( 'COUNT')を使用すると、一意であることが保証されている列(または列のグループ) 'GROUP BY'演算を指定することができます。 (外部結合は 'bids'に一致する行がないときゼロカウントを返すことができます)。一意性保証がない場合(より一般的なケース)、相関サブクエリに戻り、指定された結果を返すことができます。(パフォーマンスに関しては、適切なインデックスが利用可能な場合に両方のアプローチが有効です)。 – spencer7593

関連する問題