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

Rya*_*ing 66 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
Run Code Online (Sandbox Code Playgroud)

等......在这种情况下,您会看到联系人99和100都被标记为"志愿者"和"上传"......

我需要做的是返回那些只能匹配通过搜索表单输入的多个条件的contactid ... contactid必须匹配所有选择的标志...在我脑海中,SQL应该类似于:

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 83

您可以使用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
Run Code Online (Sandbox Code Playgroud)

(假设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'
Run Code Online (Sandbox Code Playgroud)

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


OMG*_*ies 18

使用:

  SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(DISTINCT t.flag) = 2
Run Code Online (Sandbox Code Playgroud)

关键是需要的计数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
Run Code Online (Sandbox Code Playgroud)


小智 9

考虑像这样使用INTERSECT:

SELECT contactid WHERE flag = 'Volunteer' 
INTERSECT
SELECT contactid WHERE flag = 'Uploaded'
Run Code Online (Sandbox Code Playgroud)

我认为这是最物流的解决方案.


Orb*_*bit 5

不能真正看到您的表格,但标志不能同时是'Volunteer'和'Uploaded'。如果一列中有多个值,则可以使用

WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%"
Run Code Online (Sandbox Code Playgroud)

看到格式化的表格不是很适用。