Я работаю над приложениями для корзины с 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?
Я попробовал этот код:
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
Я заметил на ваших образцах данных, что у вас есть идентификатор столбца. Эта колонка 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" для идентификации команды, правильно?
Надеюсь, это поможет.
Это происходит из-за фильтрации. 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;
Есть много вещей, которые я не понимаю в вопросе:
Возможно, вы захотите задать еще один вопрос: образцы данных как текст в вопросе и лучшее описание ваших данных и то, что вы действительно хотите сделать.
Вы можете добавить проверку, если совпадение не сегодня, а затем, начиная с порядка по дате, вы можете ограничить 1 запись, чтобы получить следующий матч.
select home, away, '1' as is_next
from games where matchdate > now()
order by matchdate asc limit 1;