2017-10-23 7 views
0

私は2つの異なるGPSデバイスの種類を含むデータベースを持っています。私はGPSデバイスの種類に基づいてフィルタを1つのクエリを作成する必要があります。行の値に基づいて異なるSELECTステートメント

(gl200)デバイスタイプのクエリは次のようになります。

SELECT t1.deviceid, t1.devicetime, t1.latitude, t1.longitude 
FROM positions t1 
INNER JOIN 
    (SELECT MAX(id) as LatestGpsPoint 
    FROM positions 
     WHERE deviceid IN 
      (SELECT deviceid FROM device_group WHERE groupid = 7) 
      AND valid = 1 
      AND attributes LIKE '%FRI%' 
      AND network != 'null' 
      AND devicetime >= (SELECT deploymentdate 
           FROM devices 
           WHERE id = deviceid 
           LIMIT 1 
      ) 
      GROUP BY deviceid 
    ) t2 
ON t1.id = t2.LatestGpsPoint 
ORDER BY t1.deviceid ASC 
LIMIT 0,100 

他のデバイスタイプ(DMT)クエリは次のようになります。私は入れしようとしている

SELECT t1.deviceid, t1.devicetime, t1.latitude, t1.longitude 
FROM positions t1 
INNER JOIN 
    (SELECT MAX(id) as LatestGpsPoint 
    FROM positions 
     WHERE deviceid IN 
      (SELECT deviceid FROM device_group WHERE groupid = 7) 
      AND valid = 1 
      AND devicetime >= (SELECT deploymentdate 
           FROM devices 
           WHERE id = deviceid 
           LIMIT 1 
      ) 
      GROUP BY deviceid 
    ) t2 
ON t1.id = t2.LatestGpsPoint 
ORDER BY t1.deviceid ASC 
LIMIT 0,100 

IF ELSE ENDステートメントを使用して、t1.protocol = 'gl200'または 'dmt'に基づいて検索条件を変更します。

答えて

0

するTry UNION:

(SELECT t1.deviceid, t1.devicetime, t1.latitude, t1.longitude 
FROM positions t1 
INNER JOIN 
    (SELECT MAX(id) as LatestGpsPoint 
    FROM positions 
     WHERE deviceid IN 
      (SELECT deviceid FROM device_group WHERE groupid = 7) 
      AND valid = 1 
      AND attributes LIKE '%FRI%' 
      AND network != 'null' 
      AND devicetime >= (SELECT deploymentdate 
           FROM devices 
           WHERE id = deviceid 
           LIMIT 1 
      ) 
      GROUP BY deviceid 
    ) t2 
ON t1.id = t2.LatestGpsPoint) 
UNION 
(SELECT t1.deviceid, t1.devicetime, t1.latitude, t1.longitude 
FROM positions t1 
INNER JOIN 
    (SELECT MAX(id) as LatestGpsPoint 
    FROM positions 
     WHERE deviceid IN 
      (SELECT deviceid FROM device_group WHERE groupid = 7) 
      AND valid = 1 
      AND devicetime >= (SELECT deploymentdate 
           FROM devices 
           WHERE id = deviceid 
           LIMIT 1 
      ) 
      GROUP BY deviceid 
    ) t2 
ON t1.id = t2.LatestGpsPoint) 
0

アン文は可能ですが、私はあなたがcase文でそれを行うことができるかもしれないと思われる場合。コードの唯一の違いは、この部分です。

... 
    AND attributes LIKE '%FRI%' 
    AND network != 'null' 
    ... 

GL200デバイスの最初のクエリにのみ適用されます。

ケース文は、AND valid = 1の後に開始されます。

SELECT t1.deviceid, t1.devicetime, t1.latitude, t1.longitude 
FROM positions t1 
INNER JOIN 
    (SELECT MAX(id) as LatestGpsPoint 
    FROM positions 
     WHERE deviceid IN 
      (SELECT deviceid FROM device_group WHERE groupid = 7) 
      AND valid = 1 
      AND CASE WHEN deviceID = 'gl200' --however you id the device 
         THEN attributes LIKE '%FRI%' --gl200 
         ELSE 1=1 --dmt 
       END 

      AND CASE WHEN deviceID = 'gl200' --however you id the device 
         THEN network != 'null' --gl200 
         ELSE 1=1 --dmt 
       END 
      AND devicetime >= (SELECT deploymentdate 
           FROM devices 
           WHERE id = deviceid 
           LIMIT 1 
      ) 
      GROUP BY deviceid 
    ) t2 
ON t1.id = t2.LatestGpsPoint 
ORDER BY t1.deviceid ASC 
LIMIT 0,100 
関連する問題