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 个值中的空值

 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实现这一目标。

解决问题的一种方法是创建一个学期表,其中包含每个学生每个完成学期的行。这将有一个指向的外键test_student.id,您可以使用COUNT(semester.id)

如果这对您来说是一个选择,那将是最好的解决方案。

编辑:

检查一下,没有测试查询,但应该可以正常工作我决定在选择本身中进行数学运算,以防止两次计算相同的东西。在您的HAVING结果准备好交付之后应用条件,就在LIMIT. 在速度优化方面,您可以尝试将 sSum 块移动到 WHERE 条件中,就像以前一样。可能影响不大

SUM()不起作用,因为它是一个汇总函数,用于汇总列中的值

此外,我对您的查询做了一些更改:

  • 不要 SELECT *,选择特定字段并添加表标识符。s(在这种情况下,我使用了student_testANDm的别名master_test
  • 您放入s.batch = '2009'单引号 - 如果该字段batch是一个整数字段,您应该使用s.batch = 2009,这将阻止 MySQL 将每一行转换为字符串,以便能够比较它(int = intcast(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 回答