Получить строки, в которых присутствует конкретное значение, а если его нет, отобразить строку с другим значением - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть условие, когда пользователь меняет свой почтовый идентификатор, значение столбца состояния меняется на 100. Если почтовый идентификатор не изменяется, то значение в столбце состояния будет 10. Идентификатор будет всегда одинаковым для пользователя.

ID      MAIL            Status
10248   xyz@xyz.com      10
10248   xyz1@xyz.com     100
10241   abc@abc.com      10
10249   pqr@pqr.com      10
10249   pqr1@pqr.com     100
10250   kbc@kbc.com      10
10251   axc@axc.com      10

Таким образом, из этого, если почтовый идентификатор был изменен, получите строку с новым почтовым идентификатором.Например, если для идентификатора присутствует статус 100, отобразите строку этого идентификатора и не отображайте строку статуса 10 для этого идентификатора.Если для идентификатора нет статуса 100, отобразите строку со статусом 10.

Я пробовал это, но он возвращает оба состояния для идентификатора.

SELECT id, mail, IF(status=100, status=100,status=10)
FROM table1;

, поэтому для идентификатора 10248 и10249, я ожидаю только строку со статусом 100.

Ответы [ 5 ]

0 голосов
/ 25 сентября 2019

, если вы не создадите процедуру и у вас нет ORM:

select b.id,b.mail,b.status from table1 b
left join (
           select  a.id,max(a.status) as status  from table1 a
           group by a.id) c on c.id = b.id  
where c.status=b.status

mysql версии 5.8 не требуется для этого запроса

0 голосов
/ 25 сентября 2019

Вы можете использовать объединение, как показано ниже. Сначала мы собираем, если status 100 is present for a id, то мы собираем другое значение статуса, то есть чей электронный идентификатор еще не изменился, а статус все еще 10

select * from test where Status = 100
union
select t.* 
from test t
left join test t1 on t1.id = t.id
    and t1.Status = 100
where t1.id IS NULL
0 голосов
/ 25 сентября 2019

Думаю, этот код поможет вам получить необходимый результат

SELECT id,mail,Status
FROM    (
            SELECT id,mail,Status, ROW_NUMBER() over(partition by id order by Status desc)RN FROM #temp
        )m
WHERE    m.RN = 1
0 голосов
/ 25 сентября 2019

Как насчет этого?:)

 SELECT  t1.ID , t1.MAIL, (
        SELECT t2.Status
         FROM table1 as t2
         WHERE t2.ID = t1.ID  -- connect
         DESC t2.Status DESC -- show latest
        LIMIT 1  -- get only TOP
    ) as currentstat
 FROM table1 as t1
 GROUP BY t1.ID

Покажет 100, если 100 существует.Покажет 10, если 100 не существует.:)

0 голосов
/ 25 сентября 2019

Насколько я понимаю, вот что вы пытаетесь сделать:

  • , если для пользователя есть строка с status code = 100, верните эту строку
  • в противном случае,вернуть строку с status code = 10

Если ваша версия (8.0+) поддерживает оконные функции, вы можете сделать что-то вроде этого:

SELECT id, mail
FROM (
  SELECT id, mail, 
    ROW_NUMBER() OVER(
      PARTITION BY id ORDER BY 
        CASE status 
          WHEN 100 THEN 0 -- Give status = 100 first priority
          WHEN 10 THEN 1 -- Give status = 10 second priority
          ELSE 2 -- Give anything else last priority
        END
    ) AS RowNum
  FROM table1
) src
WHERE RowNum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...