0

テーブル構造:

テーブル構造http://imagebin.org/index.php?mode=image&id=238883

次のような条件のいくつかを満たす両方のテーブルからデータをフェッチしたい

    WHERE batch='2009', sex='male',course='B.Tech', branch='cs', xth_percent>60, 
     x2percent>60, gradpercent>60 and (if ranktype='other' ) then 
     no._of_not_null_semester>number elseifranktype='Leet') then 
     no._of_not_null_semester>number-2

sem 1-8には、8学期のパーセンテージが含まれています。生徒が、3学期または4学期をクリアした場合、つまり8つの値のうちnull値ではない場合、各学生の結果をフィルタリングしたいと思います。

 no._of_not_null_semester 

計算する必要があります、それはデータベースの一部ではありません、それについても助けが必要です。

必要なクエリ

             SELECT * FROM student_test 
                      INNER JOIN master_test ON student_test.id=master_test.id 
                      WHERE sex='male' and batch='2009' and course='B.Tech' 
                      and xthpercent>60 and x2percent>60 and 
                      WHEN ranktype='Leet' THEN 
                              SUM(CASE WHEN sem1 IS NOT NULL THEN 1 ELSE 0
                                  WHEN sem2 IS NOT NULL THEN 1  ELSE 0
                                  WHEN sem3 IS NOT NULL THEN 1 ELSE 0
                                  WHEN sem4 IS NOT NULL THEN 1  ELSE 0
                                  WHEN sem5 IS NOT NULL THEN 1  ELSE 0) >2
                      ELSE 
                             SUM(CASE WHEN sem1 IS NOT NULL THEN 1 ELSE 0
                                 WHEN sem2 S NOT NULL THEN 1  ELSE 0
                                  WHEN sem3 IS NOT NULL THEN 1 ELSE 0
                                  WHEN sem4 IS NOT NULL THEN 1  ELSE 0
                                  WHEN sem5 IS NOT NULL THEN 1  ELSE 0) >4
4

2 に答える 2

1

構造を変更しないと、これを実現するために使用することはできませんCOUNT

この問題を解決する1つの方法は、各学生の各学期の行を含む学期テーブルを作成することです。これは外部キーを指しているので、test_student.id使用できますCOUNT(semester.id)

それがあなたにとっての選択肢であるなら、それは最良の解決策でしょう。

編集:

これを確認してください。クエリはテストしていませんが、通常は機能するはずです。同じことを2回計算しないように、select自体で計算を行うことにしました。条件は、結果を配信する準備ができた後、のHAVING直前に適用されますLIMIT。速度の最適化に関しては、以前と同じようにsSumブロックをWHERE状態に移行することができます。おそらくそれはあまり違いはありません

SUM()列の値を要約する集計関数であるため、機能しません

さらに、クエリにいくつかの変更を加えました。

  • SELECTしない*で、特定のフィールドを選択し、テーブル識別子を追加します。(この場合、 ANDのエイリアスを使用しsました)student_testmmaster_test
  • s.batch = '2009'一重引用符で囲みます-フィールドbatchが整数フィールドの場合は、を使用する必要があります。s.batch = 2009これにより、MySQLがすべての行を文字列にキャストして、テーブル内の他の数値と同じように(int = intよりもはるかに高速に)比較できるようになります。cast(int as varchar) = varchar

クエリ:

SELECT
    s.id,
    s.sex,
    s.course,
    s.branch,
    ( 
        IF ( m.sem1 IS NOT NULL, 1, 0 ) +
        IF ( m.sem2 IS NOT NULL, 1, 0 ) +
        IF ( m.sem3 IS NOT NULL, 1, 0 ) +
        IF ( m.sem4 IS NOT NULL, 1, 0 ) +
        IF ( m.sem5 IS NOT NULL, 1, 0 ) +
        IF ( m.sem6 IS NOT NULL, 1, 0 ) +
        IF ( m.sem7 IS NOT NULL, 1, 0 ) +
        IF ( m.sem8 IS NOT NULL, 1, 0 )
    ) AS sSum
FROM
    student_test s
        INNER JOIN master_test m ON m.id = s.id
WHERE
    s.sex = 'male'
    AND
    s.batch = '2009' # I dont see this field in your database diagram!?
    AND
    s.course = 'B.Tech'
    AND
    m.xthpercent > 60
    AND
    m.x2percent > 60
HAVING
    (
        m.ranktype = 'OTHER'
        AND
        sSum > 4
    )
    OR
    (
        m.ranktype = 'LEET'
        AND
        sSum > 2
    )

あなたがデータベースの設計と使用法を学ぶことに一般的に興味があるなら、私はあなたにとって非常に興味深い機会を見つけました。スタンフォード大学は、無料のデータベースクラス「データベース入門」を提供しています。これは無料で、約費用がかかります。週2時間、3週間、最終試験が含まれます。

https://class2go.stanford.edu/db/Winter2013/preview/

于 2012-12-11T08:07:33.377 に答える
0
SELECT
s.id,
s.sex,
s.course,
s.deptt,
m1.id,
m1.xthpercent,
m1.x2percent,
m1.sem1,
m1.sem2,
m1.sem3,
m1.ranktype,
m1.sem4,
m1.sem5,
m1.sem6,
m1.sem7,
m1.sem8,
m1.sSum
FROM
student_test s
    INNER JOIN(SELECT m.id,
                      m.xthpercent,
                      m.x2percent,
                      m.sem1,
                      m.sem2,
                      m.sem3,
                      m.ranktype,
                      m.sem4,
                      m.sem5,
                      m.sem6,
                      m.sem7,
                      m.sem8,
                      (    IF ( ceil(m.sem1)>0, 1, 0 ) +
                           IF ( ceil(m.sem2)>0, 1, 0 ) +
                           IF ( ceil(m.sem3)>0, 1, 0 ) +
                           IF ( ceil(m.sem4)>0, 1, 0 ) +
                           IF ( ceil(m.sem5)>0, 1, 0 ) +
                           IF ( ceil(m.sem6)>0, 1, 0 ) +
                           IF ( ceil(m.sem7)>0, 1, 0 ) +
                           IF ( ceil(m.sem8)>0, 1, 0 )
                      ) AS sSum FROM master_test m 
                                WHERE m.xthpercent>60 and 
                                      m.x2percent>60 
                               HAVING (m.ranktype='Leet' AND sSum>2 )
                               OR
                              (m.ranktype != 'Leet') AND sSum>4 )
   as m1 ON m1.id = s.id

 WHERE 
 s.sex='Male'
 and
 s.course='B.Tech'
 and 
 s.deptt='ELE'

これは最終的に私が使用しているクエリです、そのクエリが大好きです:)

于 2012-12-12T07:01:46.550 に答える