2015-05-11 4 views
1

У меня есть небольшая проблема с моим подзапросом. Я стараюсь принимать только в ближайшее событие в таблице со значением мин, но мне нужно, чтобы это было подтверждено (подтверждено = 1 и аннулировал = 0)Выберите значение min с конкретными фильтрами MYSQL

Там мой стол:

uid | location | date   | open | close | confirmed | 
1 | aaa  | 2015-05-11 | 12:00 | 14:30 | 1  | 
2 | aaa  | 2015-05-12 | 15:00 | 22:30 | 0  | 
3 | aaa  | 2015-05-15 | 11:00 | 18:30 | 0  | 
4 | aaa  | 2015-05-16 | 09:00 | 16:00 | 1  | 

И есть мой запрос: ($now является дата PHP текущего часа (H: я) и $today дата PHP в формате ГМД)

SELECT location, MIN(date) 
FROM table 
WHERE confirmed = 1 
AND IF (
    (close > '$now' AND date = '$today') OR (date> '$today'), 1, 0 
) 
GROUP By location 

Таким образом, в формате тест, мы 11 мая в 17:00. Первый из них не должен быть выбран потому, что это произошло в прошлом (сегодня утром), а второй не должен быть выбран слишком, потому что я помещал подтвердил 0

ожидаемый результат

aaa | 2015-05-16 

потому, что его ближайший с подтвердить к истинным,

, но она всегда возвращает меня

aaa | 2015-05-12 

он не заботится о заявлении где подтвержденного = 1, но Ĉ ares о if (close> '$ now' AND date = '$ today') OR (date> '$ today'), 1, 0, потому что он возвращает меня второй.

Может ли кто-нибудь помочь мне?

P.S .: Это все в MySQL

Спасибо.

- Carlos

EDIT :::

Я просто попытался добавить какое-то значение в выберите (SELECT *, MIN (дата))

и возвращает мне ассиметричным данные ???

Я получил

| 4 | aaa | 2015-05-16 | 09:00 | 16:00 | 1 | 2015-05-12 

Так первая дата является хорошим один и второй один (с мин()) не является хорошим.

Последнее редактирование :::

как это было предложено spencer7593 (спасибо ему/ей), я просто удалил мин (дата) и она автоматически возвращает мне данные, которые я хочу, хороший SQL является:

SELECT * 
FROM table 
WHERE confirmed = 1 
AND IF (
    (close > '$now' AND date = '$today') OR (date> '$today'), 1, 0 
) 
GROUP By location 
+0

Должно быть ясным. Вы пытаетесь найти местоположение с первой подтвержденной записи после даты и времени поставки? – Uueerdo

+0

Все закрывается до полуночи? – Strawberry

+0

Да все закрывается до полуночи и открывается через 2 часа ночи. Я хочу, чтобы событие futur для каждого местоположения (с группой) в моей базе данных было много мест и событий для всех. Мне нужен следующий подтвержденный номер: – Carlos2W

ответ

0

Попробуйте так:

SELECT location, MIN(date) 
FROM table 
WHERE confirmed = 1 
AND ((close > '$now' AND date = '$today') OR (date> '$today')) 
GROUP By location 

Может быть, заявление Если делает поведение неправильно.

+0

Я уже пытался удалить его. Это ничего не меняет. Он не слушает. Оператор My if действителен. – Carlos2W

+0

Я вижу, в чем проблема, попробуйте использовать инструкцию. Это место для группы. – bugs2919

+0

SELECT location, MIN (date) FROM table ГРУППА По местоположению подтверждено = 1 AND ((close> '$ now' AND date = '$ today') ИЛИ (date> '$ today')) – bugs2919

0

Учитывая данные примера, это не похоже на то, что должно быть возвращено значение даты 2015-05-12.

Я сомнение то, что типов данных колонн являются колонны confirmed в частности. Если эта колонка CHAR или VARCHAR, возможно, сравнение выполняется как символ, а не числовой, и есть некоторые скрытые символы, которые делают его неравным.

Если это так, и это завершающие символы в значении столбца, вы можете попробовать ввести confirmed в числовое значение, добавив к нему нуль в инструкции, например.

WHERE confirmed+0 = 1 

Это выражение confirmed+0 будет оцениваться в числовом контексте.

Я также с подозрением относятся к типам данных в date и close столбцов, если таковые также VARCHAR или CHAR ... хотя это не объясняет, почему предикат confirmed игнорируется.

Мы просто догадываемся, информации недостаточно, чтобы действительно рассказать, что происходит.

Для отладки этого типа проблемы, echo или vardump текст SQL перед отправкой в ​​базу данных, чтобы вы могли видеть, что действительно отправлено.

$sql = "SELECT .... " . $var . " ... ORDER BY 1"; 
    echo $sql; # for debugging 

    $dbh->query($sql); 

Я бы выбрал этот текст SQL, который испущен, и протестировать его на другом клиенте. Я попробую удалить агрегированную функцию MIN и GROUP BY и вернуть все соответствующие столбцы из строк, чтобы увидеть фактические сгруппированные строки.

+0

подтверждено, что tinyint (0 или 1 boolean) и date, open и close являются varchar – Carlos2W

+0

@ Carlos2W: Вы уверены, что нет строки с местоположением = 'aaa', date (character) = '2015-05-12' и подтверждено = 1? Я бы выполнил запрос к таблице без агрегации (удалите «GROUP BY» и функцию агрегата). (Нормативная модель заключается в использовании типа данных DATE для значений даты и типа данных TIME для значений времени, а не VARCHAR ... но это не объясняет поведение, которое вы видите с помощью предиката на 'подтверждении' column.) – spencer7593

+0

Да, потому что я только что создал новую таблицу с только этими четырьмя строками для тестирования, и это дает мне тот же результат. – Carlos2W

0

Предполагая, что вы пытаетесь найти местоположение с первой подтвержденной записи после поставленной даты и времени.

SELECT `location`, `date` 
FROM `table` 
WHERE `confirmed` = 1 
    AND (`date` > '$today' 
     OR (`date` = '$today' AND `close` > '$now') 
     ) 
ORDER BY `date`, `close` 
LIMIT 1 
; 
+0

Нет, потому что есть другие местоположения, я хочу список местоположений с их ближайшей записью (с группой), но ее правда может смутить в моем примере, потому что она имеет только одно местоположение – Carlos2W

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