在同一列上使用多个where条件进行选择

slwdgvem  于 2021-06-18  发布在  Mysql
关注(0)|答案(12)|浏览(370)

好吧,我想我可能忽略了一些明显的/简单的事情。。。但我需要编写一个查询,只返回在同一列上匹配多个条件的记录。。。
我的表是一个非常简单的链接设置应用标志到用户。。。

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

但是。。。什么也不回。。。我做错什么了?

kq0g1dla

kq0g1dla1#

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
);
u5i3ibmn

u5i3ibmn2#

无法真正看到您的表,但标志不能同时为“志愿者”和“上传”。如果一列中有多个值,则可以使用

WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%"

不太适用于查看格式化的表。

zbq4xfa0

zbq4xfa03#

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

如果旗子列表很长并且有很多匹配项,那么第一个可能会更快。如果标志列表很短,并且匹配项很少,您可能会发现第二个更快。如果性能是一个问题,请尝试对这两种数据进行测试,看看哪种方法效果最好。

blmhpbnm

blmhpbnm4#

使用:例如:

select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1001
union
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1002
clj7thdc

clj7thdc5#

有时你看不见树木也看不见树木:)
原始sql。。

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...

应该是:

SELECT contactid 
 WHERE flag = 'Volunteer' 
   OR flag = 'Uploaded'...
vshtjzan

vshtjzan6#

AND 只有在双方都同意的情况下才会给你答复 volunteer 以及 uploaded 出现在你的专栏里。否则它会回来的 null 值。。。
尝试使用 OR 在你的陈述中。。。

SELECT contactid  WHERE flag = 'Volunteer' OR flag = 'Uploaded'
isr3a4wc

isr3a4wc7#

可以这样使用intersect:

SELECT contactid WHERE flag = 'Volunteer' 
INTERSECT
SELECT contactid WHERE flag = 'Uploaded'

我认为这是最合乎逻辑的解决办法。

c6ubokkw

c6ubokkw8#

用途:

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
cu6pst1q

cu6pst1q9#

您的代码:

SELECT contactid 
WHERE flag = 'Volunteer' AND flag = 'Uploaded' [...]

不会工作,因为您没有声明表名。执行将返回错误消息。
如果您想同时显示两个搜索查询,您的代码应该如下所示。

SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded';

而不是这样,因为它总是返回false select*from(您的表名称),其中flag='志愿者'和flag='上传';
你也可以这样做

SELECT * FROM (your_table_name) 
WHERE flag = 'Volunteer' OR flag = 'Uploaded' 
ORDER BY contactid, flag asc;

(asc表示升序,如果希望按降序显示,也可以将其更改为desc)

4xy9mtcn

4xy9mtcn10#

尝试使用此备用查询:

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;
nsc4cvqm

nsc4cvqm11#

SELECT contactid, Count(*) 
FROM <YOUR_TABLE> WHERE flag in ('Volunteer','Uploaded')  
GROUP BY contactid 
HAVING count(*)>1;
64jmpszr

64jmpszr12#

改变或改变。简单的错误。把它想象成简单的英语,我想选择任何与这个或那个相等的东西。

相关问题