У меня есть небольшие проблемы с моим подзапросом. Я пытаюсь принять только ближайшее событие в таблице с минимальным значением, но мне нужно, чтобы оно было подтверждено (подтверждено = 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
Попробуйте вот так:
SELECT location, MIN(date)
FROM table
WHERE confirmed = 1
AND ((close > '$now' AND date = '$today') OR (date> '$today'))
GROUP By location
Может быть, если заявление делает поведение неправильно.
Учитывая данные примера, это, конечно, не похоже на значение даты 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
и верните все соответствующие столбцы из строк, чтобы увидеть фактические сгруппированные строки.
Предполагая, что вы пытаетесь найти местоположение из первой подтвержденной записи после предоставленной даты и времени.
SELECT `location`, `date`
FROM `table`
WHERE `confirmed` = 1
AND (`date` > '$today'
OR (`date` = '$today' AND `close` > '$now')
)
ORDER BY `date`, `close`
LIMIT 1
;