0

以下のようなデータベーステーブルがあります。

id    | lecture            | subject_id | date       | is_deleted
------|--------------------|------------|------------|-----------
 1    | Introduction       | 1          | 2012-08-10 | 0   
 2    | Structure          | 2          | 2012-08-15 | 1   
 3    | Introduction       | 2          | 2012-08-12 | 0   
 4    | Functions          | 1          | 2012-08-14 | 1   
 5    | Material           | 2          | 2012-08-18 | 0   
 6    | Requirements       | 1          | 2012-08-16 | 0   
 7    | Analysis           | 1          | 2012-08-11 | 0

このテーブル (レクチャー) からビューを作成する必要があります。これにより、行番号が表示されます。(フロー番号) 日付順に並べられた各被験者について、is_deleted = 1 行を削除します。簡単に言うと、流れをNo. 特定の科目の各講義について、削除されていない講義のみを日付順に並べ替えます。したがって、上記のデータによって作成されるビューは次のようになります。

flow_no | id   | date       | lecture            | subject_id 
--------|------|------------|--------------------|------------
 1      | 1    | 2012-08-10 | Introduction       | 1          
 2      | 7    | 2012-08-11 | Analysis           | 1          
 3      | 6    | 2012-08-16 | Requirements       | 1          
 1      | 3    | 2012-08-12 | Introduction       | 2          
 2      | 5    | 2012-08-18 | Material           | 2          

これをいくつかの方法で実行しようとしましたが、すべて失敗しました。誰かがこれを解決するのを手伝ってくれれば幸いです。(mysql)

4

2 に答える 2

0
SELECT @rownum := @rownum + 1 flow_no, id, date, lecture, subject_id
FROM subjects, (SELECT @rownum := 0) r
WHERE is_deleted = 0
ORDER BY subject_id, date, id

それをビューに変えるのはあなたに任せます。

サブジェクトごとに flow_no を再開するには、いくつかの選択肢があります。

上記のクエリをコピーし、サブクエリとしてラップし、min(flow_no)グループ化を計算subject_idして上記のクエリに結合し、各行から min flow_no を減算します。

subject_id を変数に割り当ててから、変数を現在の subject_id と照合し、毎回 rownum 変数をリセットすることができます。これが可能かどうかさえわかりません。

これを行うストアド プロシージャを作成できます。一意の subject_id のリストを取得し、それぞれに対して一連のクエリを実行して出力します。

これらのオプションはどれも私には魅力的ではありません。これが私だったら、クエリでこれを行うのをやめます。

于 2012-08-28T07:19:30.947 に答える
0

私は別のオンライン フォーラムのメンバーのサポートによって答えを見つけました。以下は、必要な正確な結果を提供します。同じ Lecture.date 行がある場合、それらの行の Lecture.id 順に flow_no を生成します。

SELECT id, lecture, Lecture.subject_id, date, c,
 (SELECT COUNT(subject_id) + 1 FROM Lecture AS l
  WHERE l.subject_id = Lecture.subject_id
  AND (l.date < Lecture.date OR (l.date = Lecture.date AND l.id < Lecture.id))
  AND is_deleted != 1
 ) AS flow_no
FROM Lecture
INNER JOIN
(
 SELECT subject_id, COUNT(subject_id) AS c
 FROM Lecture
 WHERE is_deleted != 1
 GROUP BY subject_id
) AS counts
ON Lecture.subject_id = counts.subject_id
WHERE is_deleted != 1
ORDER BY subject_id, date;
于 2012-08-29T07:03:41.577 に答える