Table structure:
Table Structure http://imagebin.org/index.php?mode=image&id=238883
I want to fetch data from both the tables which satisfy some of the conditions like
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 contains percentage for 8 semesters, and I want to filter results for each student if they have cleared 3 semesters or 4 semester i.e. not null values out of 8 values
no._of_not_null_semester
needs to be calculated, it is not a part of database, need help with that as well.
Required Query
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
Without changing the structure you can’t use
COUNTto achieve this.One way to solve the problem would be to create a semester table which would contain a row for each finished semester for each student. This would have a foreign key pointing to
test_student.idand you could useCOUNT(semester.id)If that is an option for you, it would be the best solution.
EDIT:
Check this out, didn’t test the query but should work generally
I decided to do the math in the select itself to prevent calculating the same thing twice.
The
HAVINGconditions are applied after your result is ready to deliver, just before aLIMIT.In terms of speed optimization you could try and move the sSum block into the WHERE condition just like you had it before. Probably it doesn’t make much of a difference
SUM()does not work because it is an aggregate function which summarizes values in a columnI did some changes to your query in addition:
*, select specific fields and add a table identifier. ( in this case I used the aliasessforstudent_testANDmformaster_test)s.batch = '2009'into single quotes – if the fieldbatchis an integer field, you should uses.batch = 2009, which would prevent MySQL from casting every single row to string to be able to compare it (int = intmuch faster thancast(int as varchar) = varchar) same about the other numeric values in your tableThe Query:
If you’re generally interested in learning database design and usage I found an very interesting opportunity for you.
Stanford University offers a free database class “Introduction to databases”. This is free and will cost you approx. 2 hours a week for 3 weeks, final exam included.
https://class2go.stanford.edu/db/Winter2013/preview/