Найти самую низкую дату (обычай) в mysql

Я понятия не имею, как найти самую нижнюю строку в типе даты

Я просто найду самый низкий месяц (по годам в таблице)

TableName

Id  | M  | D  |   Y   |
=======================
1  | 01  | 22  | 2012 |
2  | 11  | 29  | 2012 |
3  | 12  | 30  | 2013 |
4  | 01  | 30  | 2011 | <--- this !
5  | 12  | 14  | 2012 |

PHP:

$sql = "SELECT * FROM TableName WHERE M=?? AND Y=??";
$selected = mysql_query($sql);

поэтому $selected даст результат как "4/01/30/2011" (Id, M, D, Y)

Любые?

Ответ 1

SELECT min(concat(Y,M,D)) FROM TableName

Ответ 3

Пожалуйста, сделайте себе одолжение и используйте поле date вместо этого. Вы сэкономите массу неприятностей.

ALTER TABLE `TableName` ADD `date` DATE NOT NULL;
UPDATE `TableName` SET `date` = CONCAT( `Y` , '-', `M` , '-', `D` );

то вы сможете:

SELECT MIN(`date`) FROM `TableName`

Ответ 4

user1533609 ответ даст вам правильный результат:

SELECT min(concat(Y,M,D)) 
  FROM `TableName`

но это не сможет использовать какой-либо индекс, который у вас есть в любом из составных полей даты, поэтому вам нужно будет посетить каждую строку таблицы, чтобы определить минимальное значение.

Сочетание ответов m4t1t0 и koopajah дает вам:

  SELECT * 
    FROM `TableName`
ORDER BY Y, M, D 
   LIMIT 1

Это позволит использовать доступный индекс на Y и, возможно, даже комбинированный индекс на (Y, M, D), который может работать намного быстрее в больших таблицах.

Все это сказано; Это почти криминал, чтобы ответить на этот вопрос, который не предполагает использование поля даты вместо трех настроек столбца. Единственная причина, по которой я могу думать о разделении столбца даты, - это производительность для нишевых запросов, для которых требуются отдельные индексы в день или месяц, но выбор принятого ответа подсказывает мне, что это не так.

Как указал Люциус.. Если это дата, сохраните ее как дату и запустите:

SELECT MIN(`DateColumnName`) FROM `TableName`

В качестве бонуса это даст вам доступ ко всем функциям MySQL Temporal в столбце, включая возможность извлечения дня и месяца, отформатировать его, как вам нравится, и одно поле для индексации и упорядочивания.

Ответ 5

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

SELECT * FROM TableName ORDER BY Y, M, D ASC limit 1;

Ответ 6

Попробуйте следующее:

SELECT MIN(ColumnName) FROM TableName;

В вашем случае это будет:

SELECT MIN(Y) FROM TableName;

Ответ 7

Я даю вам некоторую идею для вашего запроса. Пожалуйста, следуйте этому:

$sql="SELECT * FROM tbl_name ORDER BY Y, M, D ASC limit 1;
$res=mysql_query($sql);
$row=mysql_fetch_array($res);

$date=$row["id"]."/".$row["M"]."/".$row["D"]."/".$row["Y"];
echo $date;

Я надеюсь, что это поможет вам

Ответ 8

SELECT concat(Y,M,D) FROM TableName
ORDER BY Y ASC, M ASC, D ASC
Limit 1

Таким образом, вы можете вернуть всю строку, заменив "concat (Y, M, D)" на * и легко адаптируясь для разных вариантов использования. Вы можете, например, верните последнюю строку даты в течение первого года:

SELECT * FROM TableName
ORDER BY Y ASC, M DESC, D DESC
Limit 1

Сохранение как DATETIME и использование родной сортировки MySQL ускоряет его. Если вам нужно сохранить отдельные значения (по какой-либо причине, например, импорт/экспорт с другими системами из вашей области), возможно, вы можете просто добавить другое значение в таблицу и синхронизировать значения?