MySQL ЕСЛИ явная проблема - почему мои записи не уникальны? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть запрос sql вроде этого:

SELECT DISTINCT Users.UserID,Users.UserInfo,UserType.UserTypeName, 
            IF(Users.UserID IN (SELECT DISTINCT Aproved.UserID FROM Aproved WHERE DATE(Aproved.Date)= '2020-07-12'),'İzinli',
            IF(Users.UserID IN (SELECT DISTINCT CheckInLog.UserID FROM CheckInLog WHERE DATE(CheckInLog.CheckTime)= '2020-07-12' AND CheckInLog.CheckType=1) ,'Başladı','Giriş Yapmadı') ) AS 'Status' ,
                
            IF(Users.UserID IN (SELECT DISTINCT CheckInLog.UserID FROM CheckInLog WHERE DATE(CheckInLog.CheckTime)= '2020-07-12' AND CheckInLog.CheckType=1),
           (SELECT DISTINCT CheckInLog.CheckTime FROM CheckInLog WHERE DATE(CheckInLog.CheckTime)= '2020-07-12' AND CheckInLog.UserID=Users.UserID AND CheckInLog.CheckType=1),' - ') AS 'Start' ,
            IF(Users.UserID IN (SELECT DISTINCT CheckInLog.UserID FROM CheckInLog WHERE DATE(CheckInLog.CheckTime)= '2020-07-12' AND CheckInLog.CheckType=2),
               (SELECT DISTINCT CheckInLog.CheckTime FROM CheckInLog WHERE DATE(CheckInLog.CheckTime)= '2020-07-12' AND CheckInLog.UserID=Users.UserID AND CheckInLog.CheckType=2),' - ') AS 'End' 
            FROM Users 
            JOIN UserType ON Users.UserType=UserType.UserTypeID 
                
            Where Users.UserType != 1 and Users.UserType != 2 

Это дает мне такие данные, как:

enter image description here

But I want data to be like

enter image description here

My check-in log table is like:

введите описание изображения здесь

CheckType = 1 -> Start CheckType = 2 -> End

Пожалуйста, помогите мне, ребята. Спасибо.

1 Ответ

0 голосов
/ 13 июля 2020

Пользователи должны быть продублированы в таблице users, чтобы не было понятно, что происходит. Однако вы можете значительно упростить свой запрос:

SELECT u.UserID, u.UserInfo, ut.UserTypeName, 
       (CASE WHEN s.UserID IN (SELECT a.UserID FROM Aproved a WHERE DATE(Aproved.Date)= '2020-07-12')
             THEN 'İzinli'
             WHEN u.UserID IN (SELECT cil.UserID FROM CheckInLog cil WHERE DATE(cil.CheckTime)= '2020-07-12' AND cil.CheckType = 1)
             THEN 'Başladı'
             ELSE 'Giriş Yapmadı'
        END) AS Status,            
       (CASE WHEN u.UserID IN (SELECT cil.UserID FROM CheckInLog cil WHERE DATE(cil.CheckTime) = '2020-07-12' AND cil.CheckType = 1),
             THEN (SELECT cil.CheckTime FROM CheckInLog cil WHERE DATE(cil.CheckTime) = '2020-07-12' AND cil.UserID = u.UserID AND cil.CheckType = 1),
             ELSE ' - '
        END) AS Start ,
       (CASE WHEN u.UserID IN (SELECT cil.UserID FROM CheckInLog cil WHERE DATE(c.cil) = '2020-07-12' AND cil.CheckType = 2)
             THEN (SELECT cil.CheckTime FROM CheckInLog cil WHERE DATE(cil.CheckTime) = '2020-07-12' AND cil.UserID = u.UserID AND cil.CheckType = 2),
             ELSE ' - '
        END) AS `End` 
FROM Users u JOIN
     UserType ut 
     ON u.UserType = ut.UserTypeID 
WHERE u.UserType NOT IN (1, 2);

Я не уверен, что это решит вашу конкретную проблему. Но обратите внимание на следующее:

  • NOT IN проще, чем множественные сравнения.
  • Одинарные кавычки следует использовать только для строковых констант и дат, а не для имен столбцов.
  • Псевдонимы таблиц упрощают запись и чтение запроса.
  • SELECT DISTINCT не подходит для подзапроса IN.
  • CASE - это стандартная форма для условной логики c в SQL и является более мощным, поскольку допускает несколько предложений.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...