提问人:RyanNehring 提问时间:10/29/2010 最后编辑:Bill KarwinRyanNehring 更新时间:8/8/2022 访问量:537297
在同一列上使用多个 WHERE 条件进行 SELECTING
SELECTING with multiple WHERE conditions on same column
问:
好吧,我想我可能在这里忽略了一些明显/简单的东西......但我需要编写一个查询,该查询仅返回与同一列上的多个条件匹配的记录......
我的表格是一个非常简单的链接设置,用于将标志应用于用户......
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 都被标记为“志愿者”和“已上传”......
我需要做的是仅返回那些与通过搜索表单输入的多个条件匹配的联系人 ID......contactid 必须匹配所有选择的标志......在我的脑海中,SQL应该看起来像这样:
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
但。。。什么也没回来......我在这里做错了什么?
答:
无法真正看到您的表格,但标志不能同时为“志愿者”和“已上传”。如果列中有多个值,则可以使用
WHERE flag LIKE "%Volunteer%" AND flag LIKE "%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'
如果标志列表很长,并且有很多匹配项,则第一个可能更快。如果标志列表很短并且匹配项很少,您可能会发现第二个更快。如果性能是一个问题,请尝试在数据上测试两者,看看哪个效果最好。
评论
GROUP BY
HAVING COUNT
用:
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
如果 contactid 和 flag 的组合没有唯一约束,则使用 is -- 如果没有重复的可能性,则可以从查询中省略 DISTINCT:COUNT(DISTINCT t.flag)
SELECT t.contactid
FROM YOUR_TABLE t
WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
HAVING COUNT(t.flag) = 2
有时你看不到树木的木头:)
您的原始 SQL ..
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
应该是:
SELECT contactid
WHERE flag = 'Volunteer'
OR flag = 'Uploaded'...
评论
AND
只有当两者都出现在您的列中时,才会返回答案。否则将返回值...volunteer
uploaded
null
尝试在您的陈述中使用...OR
SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded'
评论
Volunteer
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 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
);
将 AND 更改为 OR。简单的错误。把它想象成简单的英语,我想选择任何等于这个或那个的东西。
考虑像这样使用 INTERSECT:
SELECT contactid WHERE flag = 'Volunteer'
INTERSECT
SELECT contactid WHERE flag = 'Uploaded'
我认为这是最物流的解决方案。
评论
使用这个: 例如:
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1001
union
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1002
像这样的东西应该对你有用
SELECT * FROM `product_options` GROUP BY product_id
HAVING COUNT(option_id IN (1,2,3) OR NULL) > 0 AND COUNT(option_id IN (7) OR NULL) > 0
评论