在同一列上select多个WHERE条件
好吧,我想我可能忽略了一些明显/简单的东西…但是我需要写一个查询,只返回匹配同一列上的多个条件的logging。
我的表是一个非常简单的链接设置,用于将标志应用于用户…
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被标记为“志愿者”和“上传”…
我需要做的只是返回那些仅仅匹配通过search表单input的多个标准的联系人…联系人必须匹配所有select的标志…在我的脑海中,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'
如果标志列表很长,并且有很多匹配,那么第一个可能会更快。 如果标志列表很短,而且几乎没有匹配,则可能会发现第二个更快。 如果性能是一个问题,请尝试对您的数据进行testing,以查看哪一个效果最好。
使用:
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
不能真正看到你的桌子,但国旗不能是“志愿者”和“上传”。 如果您在一列中有多个值,则可以使用
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;
考虑像这样使用INTERSECT:
SELECT contactid WHERE flag = 'Volunteer' INTERSECT SELECT contactid WHERE flag = 'Uploaded'
我认为这是最物stream的解决scheme。
AND
只有当volunteer
和uploaded
都出现在你的专栏中时AND
才会给你答复。 否则,它将返回null
值…
尝试在您的声明中使用OR
…
SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded'
select contactid ,Count(*) from YOUR_TABLE where flag in ('Volunteer','Uploaded') group by contactid having count(*)>1;
更改为或。 简单的错误。 想想它像简单的英语,我想select等于这个或那个的任何东西。
有时你不能看到树木的木材:)
你原来的SQL ..
SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded'...
应该:
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' [...]
将不起作用,因为你没有声明表名。 执行将返回一个错误消息。
如果你想同时显示search查询,你的代码应该看起来像这样。
SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded';
而不是这样,因为它总是会返回false SELECT * FROM(your_table_name)WHERE flag ='志愿者'AND flag ='上传';
你也可以做到这一点
SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded' ORDER BY contactid, flag asc;
(按升序排列,如果要按降序显示,也可以将其更改为desc)