一つハックとJOIN
Sを使用して、興味深い問題を回避するには、GROUP_CONCATを使用することです。日付でグループ化し、有効期限を昇順で連結し、substring_index関数を使用してn番目の値を取得します。 (nでn番目の要素の代替2用)2つの素子進む(2 ''、EDATE)
+------------+----------------------------------+
| mdate | edate |
+------------+----------------------------------+
| 2010-01-01 | 2010-02-01,2010-03-02,2010-04-04 |
| 2010-02-01 | 2010-03-01,2010-04-02 |
+------------+----------------------------------+
SUBSTRING_INDEX:例で
mysql> select * from expiry;
+------------+------------+
| date | expiry |
+------------+------------+
| 2010-01-01 | 2010-02-01 |
| 2010-01-01 | 2010-03-02 |
| 2010-01-01 | 2010-04-04 |
| 2010-02-01 | 2010-03-01 |
| 2010-02-01 | 2010-04-02 |
+------------+------------+
5 rows in set (0.00 sec)
mysql> SELECT mdate,
Substring_index(Substring_index(edate, ',', 2), ',', -1) AS exp_date
FROM (SELECT `date` AS mdate,
GROUP_CONCAT(expiry order by expiry asc separator ",") AS edate
FROM expiry
GROUP BY mdate) e1;
+------------+------------+
| mdate | exp_date |
+------------+------------+
| 2010-01-01 | 2010-03-02 |
| 2010-02-01 | 2010-04-02 |
+------------+------------+
2 rows in set (0.00 sec)
は、ここでは、サブ問合せは、次の出力を与えます。
+------------+------------------------------+
| mdate | substring_index(edate,',',2) |
+------------+------------------------------+
| 2010-01-01 | 2010-02-01,2010-03-02 |
| 2010-02-01 | 2010-03-01,2010-04-02 |
+------------+------------------------------+
我々はSUBSTRING_INDEX(SUBSTRING_INDEX(EDATE、 ''、2) '' 使用してのみ第2要素(中間結果の最後の要素)を取得し、上記出力に別のSUBSTRING_INDEXを実行 - 1そこにあなたがgroup_concat_max_len値(デフォルト1024が不足することがありますCONCATする、あまりにも多くの値がありますが、高く設定することができた場合)
+------------+------------------------------------------------------+
| mdate | substring_index(substring_index(edate,',',2),',',-1) |
+------------+------------------------------------------------------+
| 2010-01-01 | 2010-03-02 |
| 2010-02-01 | 2010-04-02 |
+------------+------------------------------------------------------+
)。
UPDATE:上記のSQLはthtグループのn個の要素が少なくてもn番目の要素を与えます。 SQLが次のように変更されるのを避けるために:
SELECT mdate,
IF(cnt >= 2,Substring_index(Substring_index(edate, ',', 2), ',', -1),NULL) AS exp_date
FROM (SELECT `date` AS mdate,
count(expiry) as cnt,
GROUP_CONCAT(expiry order by expiry asc separator ",") AS edate
FROM expiry
GROUP BY mdate) e1;
絶対に1つのクエリ内で実行する必要がありますか? MySQLはサブクエリ内部で 'LIMIT'節をサポートしていないので、特に困難です。すべてを選択して実際にデータベースの外にあるレコードを探し出すのが最も簡単なことに終わることがあります。 @Chad Birch。 –
選択肢がない場合は、提案したようにしますが、単一のMySqlクエリでそれを実行できるようにするには、要件が単純で有用であると感じています。私は間違っているかもしれない、タフ:-) – bavaza
タグで 'グループごとの最高のn'。答えの中には、MySQLの欠けている機能に対処する一般的な方法があります。完全なグループセットを生成するものは選択可能でなければなりません。魔法のコードを見つけることを幸運。 –