好吧,我想我可能忽略了一些明显的/简单的事情。。。但我需要编写一个查询,只返回在同一列上匹配多个条件的记录。。。
我的表是一个非常简单的链接设置应用标志到用户。。。
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应该是这样的:
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
但是。。。什么也不回。。。我做错什么了?
12条答案
按热度按时间kr98yfug1#
使用:例如:
o2g1uqev2#
有时你看不见树木也看不见树木:)
原始sql。。
应该是:
s4chpxco3#
您的代码:
不会工作,因为您没有声明表名。执行将返回错误消息。
如果您想同时显示两个搜索查询,您的代码应该如下所示。
而不是这样,因为它总是返回false select*from(您的表名称),其中flag='志愿者'和flag='上传';
你也可以这样做
(asc表示升序,如果希望按降序显示,也可以将其更改为desc)
4zcjmb1e4#
改变或改变。简单的错误。把它想象成简单的英语,我想选择任何与这个或那个相等的东西。
bqjvbblv5#
你可以用
GROUP BY
以及HAVING COUNT(*) = _
:(假设
contact_id, flag
是独一无二的)。或使用联接:
如果旗子列表很长并且有很多匹配项,那么第一个可能会更快。如果标志列表很短,并且匹配项很少,您可能会发现第二个更快。如果性能是一个问题,请尝试对这两种数据进行测试,看看哪种方法效果最好。
bq9c1y666#
mfpqipee7#
可以这样使用intersect:
我认为这是最合乎逻辑的解决办法。
3vpjnl9f8#
用途:
关键是
t.flag
需要等于IN
条款。使用
COUNT(DISTINCT t.flag)
如果contactid和flag的组合没有唯一的约束—如果没有重复的可能性,您可以从查询中省略distinct:56lgkhnf9#
无法真正看到您的表,但标志不能同时为“志愿者”和“上传”。如果一列中有多个值,则可以使用
不太适用于查看格式化的表。
3df52oht10#
尝试使用此备用查询:
7gcisfzg11#
xsuvu9jc12#
AND
只有在双方都同意的情况下才会给你答复volunteer
以及uploaded
出现在你的专栏里。否则它会回来的null
值。。。尝试使用
OR
在你的陈述中。。。