2017-02-22 1 views
1

У меня есть эта структура таблицыMysql Выберите Последние элементы большие или равные по сей день, но лимит на одну дату только

CREATE TABLE `fixtures` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `date` date NOT NULL DEFAULT '2017-03-23', 
    `goalsHomeTeam` int(11) NOT NULL DEFAULT '0', 
    `goalsAwayTeam` int(11) NOT NULL DEFAULT '0' 
PRIMARY KEY (`id`) 
) 

Я хочу, чтобы получить детали, где дата сегодня или больше, но каждый раз, когда день матчей он должен только принести предметы только на эту дату. Так что, если у меня есть 4 предмета в 23 февраля и 3 пункта в 25 февраля, оба они больше, чем сегодня, я хочу только предметы за 23 февраля! Я попытался

  SELECT * 
      FROM fixtures 
      WHERE date >= NOW(); 

Но это приносит элементы ОБА 23-й и 25-й в в!

+0

добавить порядок по дате указателя высоты 1; – Surace

+0

@ В этом случае, если бы у OP было два предмета в последний день, OP получил бы только один из них –

+0

@Surace Я хочу все предметы в эту же дату! Ограничение 1 приведет только к одному элементу –

ответ

2

Чтобы получить ближайшую дату больше, чем сегодняшний день, вы можете использовать следующий запрос:

select min(date) from fixtures where date>current_date 

или это:

select date from fixtures 
where date>current_date 
order by date limit 1 

(текущая_дат возвращает текущую дату без информации о время, поэтому вы можете просто использовать > вместо >=). Тогда ваш запрос будет таким:

select * from fixtures 
where date=(select min(date) from fixtures 
      where date>current_date) 
+0

Спасибо, что ваш ответ отлично работает, и один выше отлично работает сейчас приходит к выходу! Считаете ли вы, что ваш ответ или реакция Алекса оптимальны? Я хочу отдать должное самому правильному –

+1

@NaszNjokaSr.Я думаю, что они будут работать почти одинаково - но в этом контексте, когда возвращается только одна дата, я предпочитаю использовать WHERE IN (подзапрос) - не забывайте добавлять индекс в столбец даты для оптимальной работы – fthiella

0

Попробуйте это:

SELECT * 
FROM fixtures 
WHERE date >= NOW() AND date = (SELECT MIN(date) FROM fixtures); 

Это всегда будет возвращать элементы из наименьшей возможной даты вы сохранили в вашей базе данных, которая всегда будет сегодня или больше, чем сегодня.

+0

Недействительное использование групповой функции –

+0

@NaszNjokaSr. Мой плохой, Это должно работать сейчас – FMashiro

+0

Спасибо за исправление! Но он все равно приносит один предмет! Если у меня есть 2 предмета в 25 и 3 предметах в 23-м! Он должен принести все предметы в 23-ом –

2
SELECT f.* 
FROM fixtures f 
INNER JOIN 
(SELECT MIN(date) min_date 
FROM fixtures 
WHERE date >= NOW()) filter 
ON filter.min_date = f.date 
+0

Спасибо, что ваш ответ отлично работает, и один выше работает отлично, теперь он подходит к производительности! Считаете ли вы, что ваш ответ или реакция @ fthiella оптимальны? Я хочу отдать должное самому правильному –

+1

Я считаю, что производительность будет такой же – Alex

+0

@NaszNjokaSr. вы можете проверить http://www.codersrevolution.com/blog/MySQL-performance-INNER-JOIN-vs-subselect, но не уверены, что эта статья верна вообще – Alex

Смежные вопросы