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 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
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)
我认为这是最物流的解决方案.
不能真正看到您的表格,但标志不能同时是'Volunteer'和'Uploaded'。如果一列中有多个值,则可以使用
WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%"
Run Code Online (Sandbox Code Playgroud)
看到格式化的表格不是很适用。