1

こんにちは、私は 2 つのテーブルa2_dealを持っています(テーブル全体が非常に大きいため言及していません)。

deviceID    companyID   stage       serverTime
1             14          -1         1349449200 
1              1          -1         1349445600 
2             21          -1         1349449200 
3             17          -1         1349447160 
1             14           3         1344449200
1             14           2         1340449200 

a2_compという別のテーブル

companyID   name
1           Microsoft
14          DELL
15          APPLE
17          Google

以下のクエリを使用して、会社の最新の段階を取得しようとしています。

SELECT deal.companyID, companies.name as Company,
if(max(serverTime),stage,Null) as Stage
FROM `a2_deal` AS deal
LEFT JOIN `a2_comp` AS companies ON deal.companyID = companies.companyID 
GROUP BY companyID
ORDER BY serverTime

私のクエリでは、最新のサーバー時間に関連するステージ値を選択することを意味するステージとして if(max(serverTime),stage,Null) を使用しています。つまり、companyID 14 のステージとして -1 が返されるはずです....しかし、何らかの理由で正しい出力が得られません..ここで私のロジックがどのように間違っているかを説明してください...ありがとう

4

3 に答える 3

1

グループごとの最大値が必要です:

SELECT a2_comp.*, a2_deal.*
FROM   a2_deal NATURAL JOIN (
  SELECT   companyID, MAX(serverTime) AS serverTime
  FROM     a2_deal
  GROUP BY companyID
) t JOIN a2_comp USING (companyID)

sqlfiddleで参照してください。

于 2012-10-12T16:27:28.473 に答える
0

caseクエリのインライン条件に使用されます。また、あなたがする必要があるかもしれません

(case when max(serverTime) = serverTime then stage else null end) as Stage

それが有効かどうかは完全にはわかりませんが、試してみてください。

于 2012-10-12T16:27:11.803 に答える
0

これを試して

SELECT deal.companyID, deal.stage, comp.name 
FROM a2_deal AS deal, a2_comp AS comp
WHERE deal.serverTime = 
     (SELECT MAX(deal2.serverTime) 
     FROM a2_deal AS deal2 
     WHERE deal2.companyID = deal.companyID)
AND comp.companyID = deal.companyID
GROUP BY deal.companyID

これは少し混乱するかもしれませんが、最も興味深い部分は、各企業の最近の serverTime を選択するサブクエリです。私は theta スタイルのクエリを使用したため、JOIN は必要ありません。

于 2012-10-12T17:47:43.540 に答える