在同一列上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)