2016-11-15 4 views
0

Ich habe zwei TabellenMySQL Query mit mehrere Bedingung

1) Student 

id | Student_name 
-------------------- 
1 | John 
2 | Joy 
3 | Raju 

2) Category 

id | category_name 
------------------------- 
1  | Maths Fest 
2  | Science Fest 
3  | IT Fest 
4  | English Fest 
5  | Cultural Fest 

3) Student_category 

    id | student_id | category_id 
------------------------------------ 
    1 | 1  |  4 
    2 | 1  |  5 
    3 | 1  |  1 
    4 | 2  |  1 
    5 | 2  |  4 
    6 | 3  |  1 
    7 | 3  |  5 
    8 | 3  |  3 

Ich brauche eine Abfrage zu schreiben Studenten auszuwählen, die sowohl in der Mathematik fest & Englisch Fest teilzunehmen.

i verwenden diese Abfrage

SELECT distinct student_name 
FROM student A,student_category B 
WHERE A.id=B.student_id 
    and B.category_id IN ('1','4') 

aber es Ergebnis Student, der in Mathe fest ODER Englisch Fest teilnehmen geben. bitte helfen Sie mir

Antwort

1

Wenn Sie zwei unterschiedliche Kategorien haben, könnten Sie einfach zweimal beitreten:

SELECT student_name 
FROM student A 
    INNER JOIN student_category B ON A.id=B.student_id AND B.category_id = 1 
    INNER JOIN student_category C ON A.id=C.student_id AND C.category_id = 4 

Auf diese Weise werden Sie die Schüler bekommen, für die beide verbindet vorhandene

Für die dynamische Auswahl von Kategorien (mehr als 2, wenn Sie den Betrag wissen und Join-Tabelle keine Duplikate) enthält, die Sie

SELECT student_name 
    FROM student A 
    INNER JOIN student_category B on A.id = B.student_id 
     AND B.category IN (1,4,5) -- one more 
    GROUP BY student_name 
    HAVING count(*) = 3 -- Number of categories in IN clause 
+0

Das ist in Ordnung, aber wenn mehr Kategorien, dann ist es praktisch nicht möglich, muss ich diese Abfrage dynamisch generieren. – Shameem

+1

@jan einige Korrekturen: SELECT student_name FROM A Student INNER JOIN student_category B ON A.id = B.student_id UND B.category_id IN (1, 4) GROUP BY student_name HAVING COUNT (*) = 2 – Shashikala

+0

@Webbie, zweites SQL ist für erweiterte Anfrage wie von Shameem angegeben – Jan

0

Try this:

SELECT student_name 
    FROM student A 
INNER JOIN student_category B 
     ON A.id = B.student_id AND B.category_id IN (1, 4) 
GROUP BY student_name HAVING count(*) = 2 

Diese Abfrage nur Studentennamen angezeigt werden können, wenn die Zählung des Studentennamen doppelt so groß ist. Einmal zum English Fest und einmal zum Math Fest.

Wenn es mehr Kategorien gibt, können Sie einfach zählen, wie viele Kategorien in Ihrer durch Kommata getrennten Zeichenfolge vorhanden sind, und count(*) = 2 durch count(*) = no. of categories ersetzen.

Beispiel Studenten zu überprüfen, die in allen Kategorien oder mehr als 2 Kategorie teilgenommen haben:

$category_id = 1, 2, 3, 4, 5 
$a = substr_count($category_id, ","); // this will count number of times comma is appearing in your string. 
$a = $a + 1;       // number of items is + 1 than number of commas. 

Abfrage sieht aus wie folgt:

SELECT A.student_name 
    FROM student A, 
     student_category B 
WHERE A.id = B.student_id AND B.category_id IN ('1', '4') 
HAVING count(*) = $a; 

Hoffe, es hilft.

+0

eine Gruppe von möglicherweise mehr sauber machen könnte, wenn Sie HAVING-Klausel verwenden – Jan

+0

Nicht sicher, wie "GROUP BY" würde hier passen? –

+0

Dies funktioniert nicht – Shameem