在同一列上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 BYHAVING 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只有当volunteeruploaded都出现在你的专栏中时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)