MySQL: сравнение даты с использованием условия IF в инструкции SELECT - PullRequest
0 голосов
/ 12 сентября 2018

Пример данных:

db1.locationDetails table

| id | locationUID | locationName |
|----|-------------|--------------|
| 1  | L0001       | Site A       |
| 2  | L0002       | Site B       |
| 3  | L0003       | Site C       |
| 3  | L0004       | Site D       |

db2.HealthData table

| id | locationID  | Date_Time        | memUsage |
|----|-------------|------------------|----------|
| 1  | L0001       | 2018-09-10 11:43 |   35     |
| 2  | L0002       | 2018-09-10 08:22 |   39     |
| 3  | L0003       | 2018-09-10 14:44 |   43     |
| 4  | L0004       | 2018-09-10 16:01 |   72     |
| 5  | L0001       | 2018-09-12 01:26 |   50     |
| 6  | L0002       | 2018-09-12 03:15 |   32     |

У меня есть запрос:

SELECT DISTINCT db1.locationDetails.locationUID,
    db1.locationDetails.locationName,
    MAX(db2.HealthData.Date_Time),
    db2.HealthData.memUsage,
    IF(DATE(db2.HealthData.Date_Time) = '2018-09-12', "ON", "OFF") AS Status
FROM db1.locationDetails
LEFT JOIN db2.HealthData
ON db1.locationDetails.locationUID = db2.HealthData.locationID
GROUP BY db1.locationDetails.locationUID

Насколько я понимаю, в столбце «Состояние» будет отображаться «ВКЛ», если Дата равна 2018-09-12, но каким-то образом всегда возвращается «ВЫКЛ» независимо от того, равно ли значение в столбце Дата_время дате.значение указано в запросе.

Может кто-нибудь сказать мне, что здесь не так?Заранее спасибо.

Ожидаемый результат:

| locationUID | locationName | Date_Time       | memUsage | Status |
|-------------|--------------|-----------------|----------|--------|
| L0001       | Site A       |2018-09-12 01:26 |   50     | ON     |
| L0002       | Site B       |2018-09-12 03:15 |   32     | ON     |
| L0003       | Site C       |2018-09-10 14:44 |   43     | OFF    |
| L0004       | Site D       |2018-09-10 16:01 |   72     | OFF    |

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

добавить группу по db1.locationDetails.locationUID, db2.HealthData.id

SELECT DISTINCT db1.locationDetails.locationUID,
        db1.locationDetails.locationName,
        MAX(db2.HealthData.Date_Time),
        db2.HealthData.memUsage,
        IF(DATE(db2.HealthData.Date_Time) = '2018-09-12', "ON", "OFF") AS Status
    FROM db1.locationDetails
    LEFT JOIN db2.HealthData
    ON db1.locationDetails.locationUID = db2.HealthData.locationID
    GROUP BY db1.locationDetails.locationUID,db2.HealthData.id
0 голосов
/ 12 сентября 2018

Используйте подзапрос, чтобы получить желаемый результат:

   select x.locationuid,x.locationname,maxitme, memusage, case when date(maxtime)='2018-09-12' then 'ON' else 'OFF' end as status
    from db1.locationDetails x
    inner join
    (select a.locationuid,maxtime,memusage
    from 
    (SELECT locationUID,MAX(Date_Time) as maxtime FROM db2.HealthData group by locationUID)a
    inner join db2.HealthData b on a.locationuid=b.locationuid)y
    on x.locationuid=y.locationuid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...