11

日付型の最下位の文字列を見つける方法がわかりません

私はちょうど最低の月を見つけます(表の年ごとに)

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「2011年4月1日30日」のような結果が表示されるはずです(Id、M、D、Y )

どれでも?

4

8 に答える 8

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

編集:これは見た目はきれいですが、非常に悪い答えなので、この答えを使用してください

于 2012-12-03T11:37:50.500 に答える
11

ORDER BY次の句を使用するだけです。

SELECT * FROM TableName
ORDER BY Y ASC, M ASC, D ASC

詳細はこちら:http ://www.tizag.com/mysqlTutorial/mysqlorderby.php

于 2012-12-03T11:38:46.243 に答える
10

bugwheels94の答えはあなたに正しい結果を与えるでしょう:

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

ただし、これは日付の構成フィールドのいずれかにあるインデックスを使用できないため、最小値を決定するためにテーブルのすべての行にアクセスする必要があります。

m4t1t0とkoopajahの答えを組み合わせると、次のようになります。

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

これにより、Yで使用可能なインデックスを使用できるようになり、(Y、M、D)で組み合わせたインデックスを使用することもできます。これにより、大きなテーブルではるかに高速に実行できます。

これはすべて言われています。3列の設定の代わりに日付フィールドを使用することを示唆しないこの質問に答えることは、ほとんど犯罪です。日付列を分離することを考えることができる唯一の理由は、日または月に個別のインデックスを必要とするニッチクエリのパフォーマンスのためですが、受け入れられた回答の選択は、そうではないことを私に示唆しています。

Luciusが指摘したように、日付の場合は、日付として保存して実行します。

SELECT MIN(`DateColumnName`) FROM `TableName`

ボーナスとして、これにより、日と月を抽出し、好きなようにフォーマットし、インデックスを付けて並べ替える単一のフィールドを含む、列のすべてのMySQLTemporal関数にアクセスできるようになります。

于 2016-03-29T10:44:43.593 に答える
9

どうぞ、あなた自身に賛成して、date代わりにフィールドを使用してください..あなたはあなた自身に多くのトラブルを救うでしょう。

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

その後、次のことができるようになります。

SELECT MIN(`date`) FROM `TableName`
于 2012-12-03T12:15:06.340 に答える
5

年、月、日でクエリの順序を実行し、結果を最初の行に制限するだけです。

SELECT * FROM TableName ORDER BY Y, M, D ASC limit 1;
于 2012-12-03T11:39:21.640 に答える
4

これを試して:

SELECT MIN(ColumnName) FROM TableName;

あなたの場合、それは次のようになります。

SELECT MIN(Y) FROM TableName;
于 2012-12-03T11:37:41.857 に答える
2

私はあなたにあなたの質問のためのいくつかのアイデアを与えています。親切にそれに従ってください:

$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;

お役に立てば幸いです

于 2016-03-28T10:57:09.237 に答える
2
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の並べ替えを使用すると、処理速度が大幅に向上します。個別の値を保持する必要がある場合(たとえば、スコープ外の他のシステムとのインポート/エクスポートなどの理由で)、テーブルに別の値を追加して値を同期することができますか?

于 2016-04-03T17:21:40.100 に答える