4

特定の列の異なる値ごとにmysqlの行番号をリセットする方法を見つけようとしています。おそらく、例で最もよく説明されています:

クライアントを訪問するユーザーのセットがあり、各クライアントは複数回訪問される可能性があり、テーブルには訪問が行われた日付が記録されます (ただし、これが最初、2 回目、3 回目などの訪問であるかどうかは記録されません)。したがって、私のテーブルは次のようになります。

clientid   visitdate
100        10-apr-2012
101        15-apr-2012
101        25-apr-2012
102        26-apr-2012
100        28-apr-2012

私が探しているのは、特定の期間に (たとえば) 2 回目の訪問が何回行われたかです。上記のデータでは、最初の訪問が 3 回、2 回目の訪問が 2 回あります。

次のように、@rownum 機能のようなものを使用する必要があると想定しています。

SELECT visitdate, clientid @rownum := @rownum + 1 as row from visit, (SELECT @rownum := 0) a ORDER BY clientid,visitdate

それは私に与える:

clientid   visitdate     row
100        10-apr-2012   1
100        28-apr-2012   2
101        15-apr-2012   3
101        25-apr-2012   4
102        26-apr-2012   5

しかし、私が本当に探しているのは:

clientid   visitdate     row
100        10-apr-2012   1
100        28-apr-2012   2
101        15-apr-2012   1
101        25-apr-2012   2
102        26-apr-2012   1

私が理解できないのは、各クライアント ID の行カウンターをリセットする方法です。

おそらく私はこれに間違った方法でアプローチしており、アプリケーション (PHP) コードでこれらの計算を行うことができますが、データベース内で達成できるはずの何かのように感じます。

SQLServer のアプローチを見てきました (例: http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-programming/74891/Auto-number-and-reset-based-on-data-value- in-a ) ですが、これは mysql では機能しないようですか?

ヘルプ/提案は大歓迎です、乾杯、アレックス

4

1 に答える 1

7

テストされていませんが、これでうまくいくはずです:

SELECT
IF(@prev != a.clientid, @rownum:=1, @rownum:=@rownum+1) as rownumber, @prev:=a.clientid, a.*
FROM (
SELECT 
visitdate, 
clientid 
FROM visit, (SELECT @rownum := 0, @prev:='') sq
ORDER BY clientid,visitdate
) a

ところで、「@rownum 機能」はありません。それは単なる自作の「ソリューション」であり、@rownum は単なる変数です。@whatever という名前にすることもできます。

于 2012-05-25T13:03:47.113 に答える