Выберите минимальное значение с конкретными где фильтры MYSQL

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

Вот мой стол:

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: i) и $today дата php в формате Y-m-d)

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

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

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

П.С .: Это все в MySQL

Спасибо.

— Carlos

РЕДАКТИРОВАТЬ :::

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

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

я получил

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

Итак, первое свидание — хорошее, а второе (с min ()) — не самое удачное.

ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ :::

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

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

1

Решение

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

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

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

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

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

SELECT `location`, `date`
FROM `table`
WHERE `confirmed` = 1
AND (`date` > '$today'
OR (`date` = '$today' AND `close` > '$now')
)
ORDER BY `date`, `close`
LIMIT 1
;
0
По вопросам рекламы [email protected]