在同一列上使用多个WHERE条件进行SELECTING

时间:2010-10-28 21:57:58

标签: mysql sql aggregate-functions where-clause

好吧,我想我可能会在这里忽略一些明显/简单的东西......但是我需要编写一个只返回同一列上符合多个条件的记录的查询...

我的表是一个非常简单的链接设置,用于将标志应用于用户......

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'...

但......没有任何回报......我在这里做错了什么?

12 个答案:

答案 0 :(得分:77)

您可以使用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'

如果标志列表很长并且有很多匹配,则第一个可能更快。如果标志列表很短且匹配很少,您可能会发现第二个更快。如果性能是一个问题,请尝试测试您的数据,看看哪个效果最好。

答案 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)

只有当您的列中包含ANDvolunteer时,

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)