2009-12-29 2 views
2

EDIT : 빠른 것이 었습니다. 그 이유는 테이블이 기본 키로 "id"를 갖고 다른 "type"기본 키로 구성된 두 테이블 사이의 피벗 테이블이기 때문입니다.mysql select narrowing search

안녕하세요. 작동하지 않는

"유형"1, 2 및

이 3 곳에서만 "ID"를 찾기 :

나는 다음 원하는해야

SELECT * FROM `table` WHERE `type` = 1 AND `type` = 2 AND `type` = 3; 

선택 한 Statment 만 하나 개의 행을 리턴 (ID = 1)

id type 
1 1 
1 2 
1 3 

2 1 
2 2 

3 3 
+1

에게이 없다 내가 뭘 Cudos가 원하는 것은 ID를 반환하는 쿼리 생각 3 가지 유형의 행이 있습니다. –

답변

6

는 세 가지 유형의 레코드가 을 (MySQL의 문서 포함) ...당신이 선택할 수있는 유형을 추가 ID와 그 유형을보고 싶다면

Select Distinct id 
    FROM `table` t 
    WHERE Exists (Select * From Table Where id = t.id and Type = '1') 
    And Exists (Select * From Table Where id = t.id and Type = '2') 
    And Exists (Select * From Table Where id = t.id and Type = '3') 

, 해당 ID를 가지고 모든 행을보고 싶다면

Select Distinct id, Type 
    FROM `table` t 
    WHERE Exists (Select * From Table Where id = t.id and Type = '1') 
    And Exists (Select * From Table Where id = t.id and Type = '2') 
    And Exists (Select * From Table Where id = t.id and Type = '3') 

는 다음 별개의

을두고
Select id, Type 
    FROM `table` t 
    WHERE Exists (Select * From Table Where id = t.id and Type = '1') 
    And Exists (Select * From Table Where id = t.id and Type = '2') 
    And Exists (Select * From Table Where id = t.id and Type = '3') 
0

정확하게 이해한다면 검색어 끝에 LIMIT 1을 추가 할 수 없습니까?

-2

잘못된 것을하고 있습니다. 동일한 ID를 가진 여러 행을 가져서는 안됩니다. 그것은 하나의 지점을 파괴합니다. id 열은 자동 증가하는 기본 키 여야합니다.

나는 돌아가서 스키마를 재검토해야한다고 생각한다. 또는 적어도 수행하려는 작업에 대한 세부 정보를 추가하십시오.

+1

구현을 모른 채 어떻게 그의 스키마에 대해 의견을 표할 수 있습니까? –

+0

Kevin, 원래 질문에 쓰여진 내용을 이해하고 있습니까? 이 테이블을 어떻게 생성하든 관계없이 select는 단일 유형의 값을 갖는 단일 행에 대해 술어 유형 = 1 AND 유형 = 2 AND 유형 = 3을 평가하려고 시도합니다. – Dmitry

+0

Kevin, 반복되는 값이있는 ID 열이 있기 때문에 그의 스키마에 대해 의견을 말하고 있습니다. 그게 id 열의 전체 지점을 깰. 편집 : 편집자가 자신의 편집 내용을 분명히합니다. 내 게시물은 id가 기본 키 (솔직히 말해서, 있어야하고 또 다른 열 foo_id가 있어야 함)라고 믿게되었습니다. –

2

한 행에는 동시에 값 1과 2와 3이있는 열을 사용할 수 없습니다. 마치 20 살, 21 살, 22 살인지 묻는 것과 같습니다. 당신은 그들 중 하나 일 수 있습니다.

당신은 유사한 무언가를하고 싶어 :

SELECT id WHERE type = 1 
INTERSECT 
SELECT id WHERE type = 2 
INTERSECT 
SELECT id WHERE type = 3 

하지만 당신은 손으로해야 할, 그래서 MySQL은, INTERSECT를 지원하지 않습니다

SELECT id FROM table WHERE 
    id IN (SELECT id FROM table WHERE 
      id IN (SELECT id FROM table WHERE type = 3) 
      AND type = 2) 
    AND type = 1 
+0

나는 그것이 못생긴 것을 부인할 수는 없지만 ... 3 가지 질문이다. 가장 많이 투표 한 솔루션은 O (n^2) 개의 쿼리를 가지고있다. (최적화 될 수는 있지만, 그것에 대해서는 내기하지 않을 것이다). – Tordek

1

검색 조건이 호환되지 않습니다 .

SELECT id FROM 
    Table t1 JOIN Table t2 ON (t1.id=t2.id) JOIN Table t3 ON (t3.id=t2.id) 
WHERE t1.type=1 AND t2.type=2 AND t3.type=3 

이 카티 제품을 구축 할 것입니다 : 필드 '형'은 같은 테이블에 두 번 가입 할 수있는 MySQL INTERSECT의 부재를 감안할 때 1, 2, 3과 동일한 동시에 될 수 없다 동일한 ID를 가진 행을 선택하고 원하는 모든 세 가지 유형을 가진 행만 보유하십시오.

SQL의 기초를 배우는 것이 많은 도움이 될 수 있습니다. 주위에 많은 정보가 있습니다. 당신은 단지 다음 ID를 알고 키워드 고유를 추가하고 단지 ID를 선택합니다,

+0

이 조건 유형 = 1 및 유형 = 2 ANd 유형 = 3이 참일 수있는 테이블을 가르쳐 주시겠습니까? 감사. – Dmitry

+0

select는 단일 행에 대해 WHERE 절으로 작성된 조건자를 평가한다는 점을 이해합니까? 관계형 모델과 첫 번째 정규 형식에서 최근에 변경된 사항이 없으면 항상 거짓입니다. – Dmitry

+0

fupsduck의 답변에 데이터에 관한 내용이 없습니다. 그는 잘못된 쿼리를 지적했다. – Dmitry

-1

귀하의 선택은 불가능합니다. 각 행에 대해 한 번에 세 가지 유형을 사용할 수 없습니다.

+0

Kevin - 데이터베이스의 주어진 행에 대해 필드가 동시에 세 가지 값을 가질 수있는 방법을 설명하십시오. – fupsduck

+0

Kevin - 저는 Asker가 이해하지 못했던 부분을 놓친 것 같습니다 - 처음에는 SELECT 문이 결코 행을 반환 할 수 없다고 말했습니다. – fupsduck

+0

그는 아무것도 묻지 않았습니다. "?" 이것을 쓰는 순간에도 그의 메시지에서. – Dmitry

1

당신은 집합의 교집합을 사용하여 작업을 수행 할 수 있습니다

SELECT id FROM table WHERE type = 1 
    INTERSECT 
SELECT id FROM table WHERE type = 2 
    INTERSECT 
SELECT id FROM table WHERE type = 3 

도 더 간단 쿼리가 있다면 내가 생각하고 있지만 지금은 아무 생각

+1

MySQL에는 INTERSECT가 없습니다. – Tordek

+0

죄송합니다. 내 잘못입니다.나는 보통 오라클을 사용하며 구현되어 있습니다. – Gaim