2

ここには少しトリッキーなものがあります。SQLiteには次の3つのテーブルがあります。

車のテーブル

.------.------.--------------.---------.
| vin  | year |     make     |  model  |
'------+------+--------------+---------'
| 1234 | 1965 | Aston Martin | DB5     |
| 5678 | 1965 | Ford         | Mustang |
| 9012 | 1994 | Ford         | Tarus   |
`--------------------------------------'

価格表

.------.-------.---------------------.
| vin  | price |    last_modified    |
'------+-------+---------------------'
| 1234 | 60000 | 2012-08-01 12:00:00 |
| 1234 | 58000 | 2012-08-02 12:00:00 |
| 1234 | 56000 | 2012-08-10 12:00:00 |
| 5678 | 30000 | 2012-08-02 12:00:00 |
| 9012 |  1000 | 2012-08-01 12:00:00 |
`------------------------------------'

マイレージテーブル

.------.---------.---------------------.
| vin  | mileage |    last_modified    |
'------+---------+---------------------'
| 1234 |   35000 | 2012-08-01 12:00:00 |
| 1234 |   35030 | 2012-08-02 12:00:00 |
| 1234 |   35100 | 2012-08-10 12:00:00 |
| 5678 |   60000 | 2012-08-02 12:00:00 |
| 9012 |  245000 | 2012-08-01 12:00:00 |
`--------------------------------------'

3つのテーブルすべてを結合して、「Cars」テーブルのすべての行を表示したいのですが、価格テーブルから最新の「last_modified」価格を1つ、マイレージテーブルから最高マイレージを1つだけ取得します。

最後に、私の結果は次のようになります。

.------.------.--------------.---------.-------.---------.
| vin  | year |     make     |  model  | price | mileage |
'------+------+--------------+---------+-------+---------+
| 1234 | 1965 | Aston Martin | DB5     | 56000 |   35100 |
| 5678 | 1965 | Ford         | Mustang | 30000 |   60000 |
| 9012 | 1994 | Ford         | Tarus   |  1000 |  245000 |
`--------------------------------------------------------'

これは、特定のVIN(つまり、「1234」)を選択した場合に行うことです。

SELECT
    c.year, c.make, c.model, c.vin, p.price, m.mileage, p.last_modified 
FROM 
    cars c
LEFT JOIN (
            SELECT 
                price, vin, last_modified
            FROM 
                price
            WHERE 
                (vin = '1234')
            ORDER BY
                last_modified DESC LIMIT 1
          ) p
LEFT JOIN (
            SELECT 
                mileage, vin, last_modified 
            FROM 
                mileage 
            WHERE 
                (vin = '1234') 
            ORDER BY 
                mileage DESC LIMIT 1
           ) m

WHERE
    (c.vin = '1234') AND (c.vin = p.vin) AND (c.vin = m.vin)
GROUP BY
    p.vin, m.vin
ORDER BY 
    c.vin, p.last_modified DESC, m.mileage ASC;

...しかし、「Cars」テーブルからすべての行を取得したいと思います。

誰か考えがありますか?

4

3 に答える 3

3

で個々の最大変更日を取得する必要がありますSubQuery。試す、

SELECT  a.*, b.price, c.mileage
FROM    Cars a
            INNER JOIN Price b
                on a.vin = b.vin
            INNER JOIN Mileage c
                on a.vin = c.vin
            INNER JOIN
            (
                SELECT vin, MAX(last_modified) lastMod
                FROM    Price
                GROUP BY vin
            ) d ON  b.vin = d.vin AND
                    b.last_modified = d.lastMod
            INNER JOIN
            (
                SELECT vin, MAX(last_modified) lastMod
                FROM    Mileage
                GROUP BY vin
            ) e ON  c.vin = e.vin AND
                    c.last_modified = e.lastMod

SQLFiddleデモ

于 2012-08-21T03:46:41.617 に答える
1

これを試してください:http ://www.sqlfiddle.com/#!5/71705/14

select c.vin, c.year, c.make, c.model, rpci.price, rmci.mileage 
from car c
join 
(  
  select * from mileage m
  join
  (
    select vin, max(last_modified) recent_modified
    from mileage
    group by vin
  ) rm on rm.vin = m.vin and rm.recent_modified = m.last_modified
) rmci on rmci.vin = c.vin
-- rmci: recent mileage complete info ;-)
join
(
  select * from price p
  join
  (
    select vin, max(last_modified) recent_modified
    from price
    group by vin
  ) rp on rp.vin = p.vin and rp.recent_modified = p.last_modified
) rpci on rpci.vin = c.vin
-- rpci: receint price complete info

出力:

| c.vin | c.year |       c.make | c.model | rpci.price | rmci.mileage |
-----------------------------------------------------------------------
|  1234 |   1965 | Aston Martin |     DB5 |      56000 |        35100 |
|  5678 |   1965 |         Ford | Mustang |      30000 |        60000 |
|  9012 |   1994 |         Ford |   Tarus |       1000 |       245000 |

ここでクエリの進行:http ://www.sqlfiddle.com/#!5/71705/14

于 2012-08-21T05:11:17.490 に答える
0

選択リストで相関クエリを使用できます。それは醜いですが、それはうまくいくでしょう。http://en.wikipedia.org/wiki/Correlated_subquery

于 2012-08-21T03:54:05.123 に答える