好吧,我想我可能会在这里忽略一些明显/简单的东西......但是我需要编写一个只返回同一列上符合多个条件的记录的查询...
我的表是一个非常简单的链接设置,用于将标志应用于用户......
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都被标记为“志愿者”和“上传”......
我需要做的是返回那些只通过搜索表单输入的符合多个条件的contactid ... contactid必须匹配所有选择的标志...在我脑海中,SQL应该看起来像:< / p>
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
但......没有任何回报......我在这里做错了什么?
答案 0 :(得分:77)
您可以使用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'
如果标志列表很长并且有很多匹配,则第一个可能更快。如果标志列表很短且匹配很少,您可能会发现第二个更快。如果性能是一个问题,请尝试测试您的数据,看看哪个效果最好。
答案 1 :(得分:17)
使用:
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
答案 2 :(得分:9)
考虑像这样使用INTERSECT:
SELECT contactid WHERE flag = 'Volunteer'
INTERSECT
SELECT contactid WHERE flag = 'Uploaded'
我认为这是最物流的解决方案。
答案 3 :(得分:4)
无法真正看到你的牌桌,但旗帜不能同时是“志愿者”和“上传者”。如果列中有多个值,则可以使用
WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%"
看到格式化的表格并不适用。
答案 4 :(得分:3)
尝试使用此备用查询:
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;
答案 5 :(得分:-1)
SELECT contactid, Count(*)
FROM <YOUR_TABLE> WHERE flag in ('Volunteer','Uploaded')
GROUP BY contactid
HAVING count(*)>1;
答案 6 :(得分:-1)
使用此: 例如:
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1001
union
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1002
答案 7 :(得分:-2)
AND
和volunteer
时, uploaded
才会给您答案。否则它将返回null
值...
尝试在您的陈述中使用OR
...
SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded'
答案 8 :(得分:-2)
将AND更改为OR。简单的错误。把它想象成简单的英语,我想选择任何等于这个或那个的东西。
答案 9 :(得分:-3)
有时你看不到树木的木材:)
您的原始SQL ..
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
应该是:
SELECT contactid
WHERE flag = 'Volunteer'
OR flag = 'Uploaded'...
答案 10 :(得分:-3)
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
);
答案 11 :(得分:-4)
您的代码:
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为升序,如果希望按降序显示,也可以将其更改为desc)