0

以下は、サブクエリが含まれている私のSQLクエリです。基本的に、特定の月と年の機器の最新の検針値を取得しようとしています。サブクエリで問題が発生していることはわかっていますが、適切に修正する方法がわかりません。

以下は、サブクエリを削除し、その月のメーター測定値を持つ機器を選択した場合の結果です。

eid eqid    name                    pid  hours  date
70  C1  KOMATSU WA250 3YD BUCKET    27  1176    2013-10-07
70  C1  KOMATSU WA250 3YD BUCKET    27  1195    2013-10-28
70  C1  KOMATSU WA250 3YD BUCKET    27  1178    2013-10-14
73  C11 KOMATSU PC200 EXCAVATOR     27  1080    2013-10-14
73  C11 KOMATSU PC200 EXCAVATOR     27  1099    2013-10-28
73  C11 KOMATSU PC200 EXCAVATOR     27  1078    2013-10-07
92  C4  CATERPILLAR 304D MINI EX    27  646     2013-10-14
92  C4  CATERPILLAR 304D MINI EX    27  645     2013-10-07
92  C4  CATERPILLAR 304D MINI EX    27  649     2013-10-28
58  E14 BOBCAT-ATV 2300 Utility     8   522     2013-10-31
61  E17 SKYTRAK FORKLIFT            40  943     2013-10-10
62  E18 SKYTRAK FORKLIFT            5   1790    2013-10-30
62  E18 SKYTRAK FORKLIFT            5   1789    2013-10-29
62  E18 SKYTRAK FORKLIFT            5   1777    2013-10-13
62  E18 SKYTRAK FORKLIFT            5   1772    2013-10-07
62  E18 SKYTRAK FORKLIFT            5   1777    2013-10-13
62  E18 SKYTRAK FORKLIFT            5   1772    2013-10-04
62  E18 SKYTRAK FORKLIFT            5   1772    2013-10-07
62  E18 SKYTRAK FORKLIFT            5   1772    2013-10-04
67  E23 BOBCAT SKID STEER           27  1178    2013-10-28

以下は、サブクエリを含む完全なクエリの結果です。

92  C4  CATERPILLAR 304D MINI EX    27  649    2013-10-28
61  E17 SKYTRAK FORKLIFT            40  943    2013-10-10
62  E18 SKYTRAK FORKLIFT            5   1790   2013-10-30

以下は私が使用しているクエリです。

SELECT e.eid, e.eqid, e.name, m.pid, m.hours, m.date FROM meter m
JOIN equipment e ON m.eid = e.eid
WHERE MONTH(date) = $month
AND YEAR(date) = $year
AND m.date = (SELECT MAX(m2.date) FROM meter m2 WHERE m2.eid = m.eid)
ORDER BY e.eqid ASC

どんな助けでも大歓迎です。

編集***私はセバスにたどり着けなかったでしょう。1 つのことを変更する必要があり、それは完全に機能しました。

SELECT DISTINCT e.eid, e.eqid, e.name, m.pid, m.hours, m.date 
FROM equipment e
JOIN (
    SELECT eid, MAX(date) as date
    FROM meter
    WHERE MONTH(date) = $month
    AND YEAR(date) = $year
    GROUP BY eid
) maxdate ON maxdate.eid = e.eid
JOIN meter m ON m.eid = e.eid AND m.date = maxdate.date
ORDER BY e.eqid ASC
4

2 に答える 2

1

試す

SELECT e.eid, e.eqid, e.name, m.pid, m.hours, m.date
  FROM 
(
  SELECT eid, MAX(date) date
    FROM meter
   WHERE date BETWEEN '2013-10-01' AND LAST_DAY('2013-10-01')
   GROUP BY eid
) q JOIN meter m 
    ON q.eid = m.eid 
   AND q.date = m.date JOIN equipment e
    ON q.eid = e.eid
 ORDER BY e.eid

注:にインデックスがあることを確認してくださいdateMONTH()句内のこの列に関数 (およびそのようなもの) を適用しないでくださいWHERE。これは、完全なテーブル スキャンを効果的に引き起こす可能性のあるインデックスを使用できないためです。

出力例:

| | EID | EQID | 名前 | PID | 営業時間 | 日付 |
|-----|------|--------------------------|-----|--- ----|------------|
| | 58 | E14 | BOBCAT-ATV 2300 ユーティリティ | 8 | 522 | 2013-10-31 |
| | 61 | E17 | スカイトラック フォークリフト | 40 | 943 | 2013-10-10 |
| | 62 | E18 | スカイトラック フォークリフト | 5 | 1790年 | 2013-10-30 |
| | 67 | E23 | ボブキャット スキッドステア | 27 | 1178 | 2013-10-28 |
| | 70 | C1 | コマツ WA250 3YD バケット | 27 | 1195 | 2013-10-28 |
| | 73 | C11 | コマツ PC200 ショベル | 27 | 1099 | 2013-10-28 |
| | 92 | C4 | キャタピラー 304D ミニ EX | 27 | 649 | 2013-10-28 |

これがSQLFiddleのデモです

于 2013-11-08T17:52:05.007 に答える