0

where条件の一部ではないselectがあるmysqlステートメントを1つ実行したいと思います。これは私のコードです:

    SELECT oil.empid
     , oil.mileage
     , oil.`date`
     , max(oil.mileage) AS expr1

FROM
  oil
WHERE
  oil.mileage < (SELECT max(oil.mileage) AS expr1
                 FROM
                   oil)

GROUP BY
  oil.empid
ORDER BY
  oil.mileage

これで2番目に大きいマイレージが選択されますが、私が欲しいのは2番目と最大のマイレージの両方です。WHEREの外でmax(mileage)を選択する必要があると思いますが、その方法がわかりません。助けてくれてありがとう

編集:これらの1497に入力されたデータが

走行距離:100、100000、および200000

そしてempid2000の場合

走行距離:100、1500、5000

私はこれが欲しいです:

 empid|2nd max  | max
 1497 | 100000  |  200000
 2000 | 1500    |  5000 
4

2 に答える 2

1

これは素朴な反応かもしれませんが、なぜこれをしないのですか?

SELECT oil.empid
      , oil.mileage
      , oil.`date`
      , max(oil.mileage) as expr1
FROM oil
GROUP BY oil.empid, oil.`date`
ORDER BY oil.mileage DESC
LIMIT 2

更新
OPの更新を考えると、次のようなまったく異なる種類のクエリが必要であることは明らかです。

SELECT outer.empid
       , (SELECT first.mileage
          FROM oil as first
          WHERE first.empid = outer.empid
          ORDER BY first.mileage DESC
          LIMIT 1) AS max
       , (SELECT second.mileage
          FROM oil as second
          WHERE second.empid = outer.empid
          ORDER BY second.mileage DESC
          LIMIT 1
          OFFSET 1) as 2nd_max
FROM oil as outer
于 2012-06-27T13:58:52.140 に答える
1

MySQLの句LIMITでwithを使用して、2番目のマイレージを見つけることができます。このように、高価なを使用しないことで利益を得ることができます。OFFSETORDER BYGROUP BY

(更新)OPによる説明後:

SELECT oil.empid
     , oil.mileage
     , oil.date
FROM
        oil
    JOIN
        ( SELECT DISTINCT empid
          FROM oil
        ) AS emp
            ON  oil.empid = emp.empid
            AND oil.mileage >= 
                ( SELECT mileage
                  FROM oil AS o
                  WHERE o.empid = emp.empid
                  ORDER BY mileage DESC
                  LIMIT 1  OFFSET 1
                )
ORDER BY
    oil.empid
  , oil.mileage               --- ASC or DESC here, your choice
;
于 2012-06-27T14:02:26.040 に答える