동일한 열에서 여러 WHERE 조건으로 선택
좋아, 나는 여기에서 명백하고 단순한 것을 간과하고 있다고 생각한다 ...하지만 동일한 열에서 여러 기준과 일치하는 레코드 만 반환하는 쿼리를 작성해야합니다
내 테이블은 사용자에게 플래그를 적용하기위한 매우 간단한 연결 설정입니다.
ID contactid flag flag_type
-----------------------------------
118 99 Volunteer 1
119 99 Uploaded 2
120 100 Via Import 3
121 100 Volunteer 1
122 100 Uploaded 2
등 ...이 경우 연락처 99와 100이 모두 "Volunteer"및 "Uploaded"로 플래그 지정된 것을 볼 수 있습니다.
내가 할 수 있어야 할 것은 검색 양식을 통해 입력 한 여러 기준과 일치하는 연락처 ID 만 반환하는 것입니다 ... 연락처 ID는 선택한 모든 플래그와 일치해야합니다 ... 내 머리에 SQL은 다음과 같이 보일 것입니다.
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
하지만 ... 아무것도 반환하지 않습니다 ... 내가 여기서 뭘 잘못하고 있니?
GROUP BY
및 HAVING COUNT(*) = _
다음을 사용할 수 있습니다 .
SELECT contact_id
FROM your_table
WHERE flag IN ('Volunteer', 'Uploaded', ...)
GROUP BY contact_id
HAVING COUNT(*) = 2 -- // must match number in the WHERE flag IN (...) list
( contact_id, flag
유일 하다고 가정 ).
또는 조인을 사용하십시오.
SELECT T1.contact_id
FROM your_table T1
JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded'
-- // more joins if necessary
WHERE T1.flag = 'Volunteer'
플래그 목록이 매우 길고 일치하는 항목이 많으면 첫 번째가 더 빠를 것입니다. 플래그 목록이 짧고 일치하는 항목이 거의없는 경우 두 번째가 더 빠르다는 것을 알 수 있습니다. 성능이 문제가되는 경우 데이터에서 두 가지를 모두 테스트하여 어떤 것이 가장 잘 작동하는지 확인하십시오.
사용하다:
SELECT t.contactid
FROM YOUR_TABLE t
WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
HAVING COUNT(DISTINCT t.flag) = 2
중요한 것은 계산 t.flag
이 IN
절의 인수 수와 같아야 한다는 것입니다 .
의 사용은 COUNT(DISTINCT t.flag)
contactid와 flag의 조합에 고유 한 제약이없는 경우입니다. 중복 가능성이 없으면 쿼리에서 DISTINCT를 생략 할 수 있습니다.
SELECT t.contactid
FROM YOUR_TABLE t
WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
HAVING COUNT(t.flag) = 2
다음과 같이 INTERSECT를 사용하는 것이 좋습니다.
SELECT contactid WHERE flag = 'Volunteer'
INTERSECT
SELECT contactid WHERE flag = 'Uploaded'
나는 그것이 가장 물류 솔루션이라고 생각합니다.
실제로 테이블을 볼 수는 없지만 플래그는 'Volunteer'및 'Uploaded'가 될 수 없습니다. 열에 여러 값이있는 경우 다음을 사용할 수 있습니다.
WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%"
형식이 지정된 테이블을 보면 실제로 적용 할 수 없습니다.
다음 대체 쿼리를 사용해보십시오.
SELECT A.CONTACTID
FROM (SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'VOLUNTEER')A ,
(SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'UPLOADED') B WHERE A.CONTACTID = B.CONTACTID;
SELECT contactid, Count(*)
FROM <YOUR_TABLE> WHERE flag in ('Volunteer','Uploaded')
GROUP BY contactid
HAVING count(*)>1;
이것을 사용하십시오 : 예 :
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1001
union
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1002
AND를 OR로 변경합니다. 단순한 실수. 평범한 영어처럼 생각하세요. 저는 이것 또는 저것과 같은 것을 선택하고 싶습니다.
AND
당신에게 모두 만 답변을 반환 volunteer
하고 uploaded
당신의 열의에 존재합니다. 그렇지 않으면 null
값 을 반환 합니다 ...
OR
당신의 진술에서 사용해보십시오 ...
SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded'
select purpose.pname,company.cname
from purpose
Inner Join company
on purpose.id=company.id
where pname='Fever' and cname='ABC' in (
select mname
from medication
where mname like 'A%'
order by mname
);
귀하의 코드 :
SELECT contactid
WHERE flag = 'Volunteer' AND flag = 'Uploaded' [...]
테이블 이름을 선언하지 않았기 때문에 작동하지 않습니다. 실행은 오류 메시지를 반환합니다.
두 검색 쿼리를 모두 표시하려면 코드가 다음과 같아야합니다.
SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded';
항상 false를 반환하므로 이와 같지 않습니다. SELECT * FROM (your_table_name) WHERE flag = 'Volunteer'AND flag = 'Uploaded';
당신은 또한 이것을 할 수 있습니다
SELECT * FROM (your_table_name)
WHERE flag = 'Volunteer' OR flag = 'Uploaded'
ORDER BY contactid, flag asc;
(asc for ascending order, you can also change it to desc if you want it to display in descending order)
Sometimes you can't see the wood for the trees :)
Your original SQL ..
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
Should be:
SELECT contactid
WHERE flag = 'Volunteer'
OR flag = 'Uploaded'...
참고URL : https://stackoverflow.com/questions/4047484/selecting-with-multiple-where-conditions-on-same-column
'Program Tip' 카테고리의 다른 글
파이썬 : 두 단어로 된 이름을 가진 모듈 이름 지정 (0) | 2020.11.21 |
---|---|
더 큰 애플리케이션 범위를 제공하기 위해 이전 버전의 libc에 대한 링크 (0) | 2020.11.21 |
javascript / html5로 즉석에서 사운드 생성 (0) | 2020.11.21 |
필드 대 속성. (0) | 2020.11.21 |
PHP의 "easter egg"URL을 비활성화하려면 어떻게해야합니까? (0) | 2020.11.21 |