2013-07-23 19 views
5

Poniżej znajduje się mój stół o nazwie najsilniejszy. Muszę dowiedzieć się, którzy uczniowie na podstawie identyfikatora ucznia (studenta) wzięli udział w teście przed i po zdaniu określonym w kolumnie "Preost". Więc w oparciu o prostą tabelę poniżej musiałbym zwrócić studid 123456. Jak napisać zapytanie SELECT do tego?MYSQL - WYBIERZ z wielu wierszy, ten sam użytkownik, różne wartości

SQL query: SELECT studid, prepost FROM `fittest` LIMIT 0, 30 ; 

    studid prepost 
    123456 pre 
    123456 post 
    1031460 pre 
+0

co próbowałeś do tej pory? pokaż nam swoje zapytanie i daj nam znać, gdzie napotkasz problem. –

Odpowiedz

3

Spróbuj

SELECT studid 
    FROM fittest 
GROUP BY studid 
HAVING COUNT(DISTINCT prepost) = 2 

lub jeśli chcesz zapewnić że tylko identyfikatory, które mają dokładnie jeden wiersz z pre i jeden wiersz z post następnie można wymusić to jak to

SELECT studid 
    FROM fittest 
GROUP BY studid 
HAVING (MAX(prepost = 'pre') + 
     MAX(prepost = 'post')) = 2 
    AND COUNT(DISTINCT prepost) = 2 

Wyjście:

 
| STUDID | 
---------- 
| 123456 | 

Oto SQLFiddle demo zarówno dla zapytania

+0

** [Możliwe błąd] (http://sqlfiddle.com/#!2/f73d0/1) ** – Luv

+0

@ Żużel: OP mają tylko opcję TYLKO jako pre i post. –

+0

@ Uv Wierzę, że OP ma tylko wartości "pre" i "post" w prawdziwym życiu. Ale dodałem zapytanie, które eliminuje możliwość posiadania wierszy z wartościami innymi niż przed i po. – peterm

-1

Wybierz .... gdzie studid w (123456,123457 ...)

+0

co ????????????? –

+0

'na podstawie studid' SELECT badid, prepost FROM 'fittest' gdzie studiował w (123456,123457, ...) – frag

+0

** przeczytaj, o co OP pyta ** –

0

try:

select f1.studid 
     from fittest f1 
     inner join fittest f2 
     on f1.studid = f2.studid 
    where f1.prepost = 'pre' and f2.prepost = 'post' 

oto SQL Fiddle

+1

to nigdy nie da żadnego wyjścia –

+0

@downvoter: złe zapytanie nie ma znaczenia dla downvote. .. ** PROSZĘ ** –

+0

sprawdź moją aktualizację. –

0

W zależności od rzeczywistego klucza podstawowego:

SELECT studid 
FROM fittest 
WHERE prepost = 'pre' OR prepost = 'post' 
GROUP BY studid 
HAVING COUNT(DISTINCT prepost) = 2 
0
SELECT t1.studid 
FROM fittest t1 
INNER JOIN t2 ON t1.studid=t2.studid 
WHERE t1.prepost = 'pre' 
AND t2.prepost='post' 
+1

chociaż masz rację, ale zamiast dołączyć, myślę, że odrębna opcja jest szybka ... –

+0

Zgadzam się z tobą. Odpowiedź Peterma wydaje się bardziej skuteczna. Zostawiłem swoją odpowiedź dla celów informacyjnych, ale zdecydowanie nie jest to najlepsze. –

0

Jeśli są możliwe tylko przed i po w tej kolumnie, a następnie spróbuj

SELECT studid FROM fittest group by studid 
HAVING Min(prepost)<>max(prepost) 
0
SELECT 
studid 
FROM `fittest` 
where prepost = 'pre' 
or prepost = 'post' 
group by studid 
having count(distinct prepost)=2 

SQL Fiddle z dodatkowym rekordów.

+0

Nie sądzę, że będzie to miało wyjście ... 'gdzie prepost = 'pre' i prepost = 'post'' za każdym razem się nie powiedzie, bo to nie jest możliwe ... –

+0

@Fahim Parkar Dzięki za wskazanie mi bug.Sprawdź teraz. – Luv

+0

** [Tutaj jest błąd w zapytaniu] (http://sqlfiddle.com/#!2/a18e3/1) ** – peterm

0

Można użyć JOIN

SELECT a.studid 
FROM fittest a 
JOIN fittest b 
    ON a.studid=b.studid 
     and a.prepost like 'pre' 
     and b.prepost like 'post' 
4

Co o JOIN:

select s1.studid, s1.prepost, s2.prepost 
from fittest s1 
inner join fittest s2 
    on s1.studid = s2.studid 
where s1.prepost = 'pre' 
    and s2.prepost = 'post' 
Powiązane problemy