Вернуть следующую предстоящую дату совпадения из таблицы?

0

Я работаю над приложениями для корзины с mysql ver. 5.6. В календаре каждой команды я хочу получить, если игра является следующей предстоящей игрой или нет, возвращая значение 1 или 0.

Я попытался с этим запросом, но если в текущий день есть игра, это не рассматривается; также, если есть игра, например, в следующем месяце, также она не считается (я знаю, что это потому, что я устанавливал интервал за неделю):

select home, away, 
(case when (score_home = 0 and score_away = 0) 
and (match_date between now() and date_add(now(), interval 7 day))
then 1 else 0 end) as is_next

from calendario

order by year(match_date) asc, month(match_date) asc, day(match_date) asc

ДЕДАЛЬНЫЕ ДАННЫЕ ОБРАЗЦОВ

Пожалуйста, посмотрите данные примера. Почему все столбцы равны 0?

Изображение 174551

Я попробовал этот код:

SELECT C.ID, C.DATA, C.IDCAMPIONATO, (C.DATA >= CURDATE() AND NOT EXISTS (SELECT 1 FROM CALENDARIO C2 WHERE C2.DATA >= CURDATE() AND C2.DATA < C.DATA)) AS IS_NEXT
FROM CALENDARIO C
WHERE C.IDCAMPIONATO = 5
ORDER BY DATE(C.DATA) ASC
  • 0
    Отредактируйте свой вопрос и предоставьте образцы данных и желаемых результатов.
  • 0
    Привет, Гордон. я сделал
Показать ещё 6 комментариев
Теги:

3 ответа

1
Лучший ответ

Я заметил на ваших образцах данных, что у вас есть идентификатор столбца. Эта колонка Auto-Inc? Если да, вы можете использовать свою потенциальную возможность следующим образом:

SELECT C.ID, C.DATA, C.IDCAMPIONATO,
(CASE WHEN CAL.ID = (SELECT C2.ID FROM CALENDARIO C2 WHERE C2.DATA >= CURDATE() AND C2.IDCAMPIONATO = IDCA ORDER BY C2.DATA LIMIT 1) THEN 1 ELSE 0 END) AS IS_NEXT,
FROM CALENDARIO C
WHERE C.IDCAMPIONATO = 5
ORDER BY DATE(C.DATA) ASC

Я думаю, что вы используете столбец "IDCAMPIONATO" для идентификации команды, правильно?

Надеюсь, это поможет.

  • 0
    Замечательно. Спасибо
2

Это происходит из-за фильтрации. now() содержит компонент времени. Вы хотите curdate() вместо этого и проверить, соответствует ли какая-либо другая игра. Следующее будет отмечать следующую игру в calendario, которая, по-видимому, является тем, о чем вы просите:

select c.*, 
       (c.match_date >= curdate() and
        not exists (select 1
                    from calendario c2
                    where c2.match_date >= curdate() and
                          c2.match_date < c.match_date
                   )
       ) as is_next
from calendario c
order by date(c.match_date) asc;

Есть много вещей, которые я не понимаю в вопросе:

  • Почему вы включаете оценки в условиях?
  • Если вы хотите, чтобы это за команду, почему вы не фильтруете команду?
  • Что это значит? "В календаре каждой команды..."

Возможно, вы захотите задать еще один вопрос: образцы данных как текст в вопросе и лучшее описание ваших данных и то, что вы действительно хотите сделать.

  • 0
    Я включил счет после того, как перепробовал много запросов, поэтому я нашел лучшее временное решение для меня. Я уже фильтрую по команде, но если вы видите пример «МАЙАМИ», сравните больше раз. «В календаре каждой команды» означает, что у каждой команды есть свой календарь
0

Вы можете добавить проверку, если совпадение не сегодня, а затем, начиная с порядка по дате, вы можете ограничить 1 запись, чтобы получить следующий матч.

 select home, away, '1' as  is_next
from games where matchdate > now()
order by matchdate asc limit 1;  

http://sqlfiddle.com/#!9/88ba84/2

  • 0
    Нет, я не хочу отображать только 1 запись. Мне нужно все
  • 0
    Убрал лимит 1, чтобы получить все записи
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню