0

私はテーブルを持っています:

-Parts-
ID
name

-ReportA-
ID
PART_ID
LOCATION_ID
GPS_ID
USER_ID
VALVE_ID
DATE

-ReportB-
ID
PART_ID
LOCATION_ID
TYPE_ID
NOTES
GPS_ID
DATE

(1) レポート A または B のいずれかを持つすべてのパーツを取得したい:

SELECT
    *
FROM
    parts
WHERE
    id IN (SELECT id FROM reports_a UNION SELECT id FROM reports_b

パーフェクト (1) しかし、最新のレポート (A または B) から LOCATION_ID と GPS_ID を取得する必要があります。

例:

-Parts-
1
Valve

-ReportA-
1
1
4
9
2
12
2013-02-01

-ReportB-
1
1
113
3
"Changed part"
90
2013-03-27

したがって、すべてのパーツとその最新の位置と GPS ID を取得できる SQL スクリプトが必要です。上記の結果は次のようになります。

PART_ID = 1
LOCATION_ID = 113
GPS_ID = 90

そこで、以前の SQL スクリプトを次のように変更します。

SELECT
    id AS PART_ID
    (
        (
           SELECT location_id FROM reports_a ORDER BY date DESC
           UNION
           SELECT location_id FROM reports_b ORDER BY date DESC
        )
        ORDER BY
           date DESC
        LIMIT 1  
    ) AS LOCATION_ID
FROM
    parts
WHERE
    id IN (SELECT id FROM reports_a UNION SELECT id FROM reports_b

ただし、UNION によって返されるフィールドではないため、日付 DESC で注文できませんか?

何か案は??

4

1 に答える 1

1

更新:以前の質問を誤解していたようです。以下のクエリは特定の最新のデータを取得しますproduct_id

SELECT 
    id,
    name,
    (
      SELECT 
        CONCAT( 'Location_id: ',location_id, ' gps_id: ', gps_id, ' date: ', `date` )
      FROM 
        ( SELECT `date`,part_id, location_id, gps_id FROM reportA
        UNION 
        SELECT `date`,part_id, location_id, gps_id FROM reportB
        ) t
      WHERE part_id = p.id  
      ORDER BY `date` desc 
      LIMIT 1) 
    as details
FROM 
    parts p

SQLフィドル

あなたが使用している構造は正しくありません。理想的には、すべての report_data をreport_typeAまたはB

于 2013-04-03T17:51:41.997 に答える