2014-06-12 4 views
0

임이 쿼리를MySQL의 서브 쿼리는 서브 쿼리

SELECT COUNT(*) AS CONNECTIONS, SERVERS.NAME AS SERVER_NAME, USERS.USERNAME AS USER, CONECT_DATE AS CONNECTION_DATE 
FROM CONECTIONS JOIN SERVERS ON(CONECTIONS.SERVERID = SERVERS.ID) 
JOIN USERS ON (CONECTIONS.USERID = USERS.ID) 
WHERE CONECTIONS.USERID = (SELECT ID FROM USERS 
WHERE UPPER(USERNAME) =         UPPER((SELECT USERNAME FROM USERS))) 
AND CONECT_DATE BETWEEN '2010-06-11' AND '2019-06-11' 
GROUP BY SERVERID, CONECT_DATE; 

임 (모든 사람 'UPPER를 선택하는 하위 쿼리를 만들기로 DB 테이블 USERS의 각 사용자에서이 쿼리를 얻으려고 노력 (실행에 하나 개 이상의 행을 선택 수를 반환 SELECT USERNAME FROM USERS))) '그리고 그 것은 결과의 둘 이상의 행을 반환하지만 직접'ADMIN '과 같은 USERNAME을 넣으면 결과가 나옵니다.

+0

대/소문자 구분 데이터 정렬을 사용하고 있습니까? 그리고 (모든 맞춤법 실수를 제외하고)이 쿼리의 후반 부분은 횡설수설합니다. 원하는 DDL (및/또는 sqlfiddle)과 함께 원하는 결과 세트를 제공하십시오. – Strawberry

답변

1

이것은 당신의 where 절입니다 :

WHERE CONECTIONS.USERID = (SELECT ID 
          FROM USERS 
          WHERE UPPER(USERNAME) = UPPER((SELECT USERNAME FROM USERS)) 
         ) 

이 적어도 세 가지 문제가 있습니다. USERS 표는 0 또는 1 행을 가지고 있지 않는

  1. UPPER()에 하위 쿼리 인수는 하나 개 이상의 값, 가능성 의지를 반환 할 수 있습니다.
  2. =에서 UPPER()까지 비슷한 문제가 있습니다. in이 더 적합합니다.
  3. 외부 where 절에 =을 사용하면 비슷한 문제가 발생합니다. in이 더 적합합니다.

다음 수정이 문제 그러나

WHERE CONECTIONS.USERID IN (SELECT ID 
          FROM USERS 
          WHERE UPPER(USERNAME) IN (SELECT UPPER(USERNAME) FROM USERS)) 
          ) 

, 나는 그 전체 쿼리가 해결됩니다 의심한다. SQL에 대한 지식은 약간 제한적으로 보입니다. 다른 질문을하고 샘플 데이터와 원하는 결과를 제공하고 원하는 것을 설명하는 것이 좋습니다. 그러면이 사이트의 숙련 된 사람들이 귀하의 질문을 작성하는 올바른 방향을 제시 할 수 있습니다.

+0

고마워요! 그것은 완벽하게 작동하며, date1과 date2 사이의 특정 날짜에 각 사용자가 서버에 한 연결 (연결 수 계산)을 표시하려고합니다. – Ivor

3

username=select...입니다. 평등 테스트에서 사용되는 하위 쿼리는 하나의 필드/행만 반환 할 수 있습니다. 필터링되지 않은 "사용자 테이블의 모든 것을 내놔"라고하기 때문에 각 필드의 행이 여러 개 반환됩니다. 이를 위해 당신은 IN 일치해야합니다

SELECT ... 
WHERE ... UPPER(username) IN (SELECT USERNAME FROM users) 
         ^^^^---this 

SQL은 IN 연산자는 값 집합의 비교를 위해, 작동 이유입니다 본질적으로

WHERE foo=1,2,3,4,5,6 

무엇 허용하지 않습니다.

+0

글쎄, 다른 질문에 대답하려고 애 쓰고 다른 사람 – Strawberry

+0

+1을 붙이면 되겠습니까 ... 맞거나 틀리다 – Jain