这是我的问题:
SELECT * FROM addresses
WHERE (addresses.name LIKE '%Jonathan%' OR addresses.domain LIKE '%Jonathan%')
AND (addresses.name LIKE '%gmail' OR addresses.domain LIKE '%gmail%')
对AND
子句使用WHERE
语句,假设AND
子句之后的部分没有命中任何内容,结果为null,因为它被添加作为AND
声明?我试图抓住,在这个例子中,每个人都使用address.name作为Jonathan,每个人都是Jonathan,地址为.domain作为gmail。但是,如果让我们说在这个例子中gmail不存在任何名为Jonathan的人,我想要所有的Jonathan结果(这就是为什么我认为使用AND语句不起作用)我可能没有正确写这个。
由于
答案 0 :(得分:1)
如果第一组条件或第二组条件不符合WHERE
条件,则使用AND
,查询将不会返回任何结果。
基本上,
WHERE (true) and (true) -- returns True
WHERE (true) and (false) -- returns False
WHERE (false) and (false) -- returns False
鉴于您的编辑,如果我理解正确,一种选择是将表格重新连接到自己计算gmail等电子邮件的数量。像这样:
select *
from addresses a
inner join (
select name, count(case when domain like '%gmail%' then 1 end) cnt
from addresses
where name like '%Jonathan%'
) a2 on a.name = a2.name
where a.domain like '%gmail%' or a2.cnt = 0
;
通过这种方式,您可以检查是否有人被命名为Jonathan,以及是否有像gmail一样的域名。如果域的计数为0(意味着没有人喜欢gmail),则所有人都将返回,否则,只返回那些像gmail一样的域名。
答案 1 :(得分:1)
您对不同的字段使用相同的比较,这可能导致逻辑错误,请看一下这个例子
CREATE TABLE addresses
(
id int auto_increment primary key,
name varchar(20),
domain varchar(30)
);
INSERT INTO addresses
(name, domain)
VALUES
('Jonathan', 'Jonathan@gmail.com'),
('Jonathan', 'Xavier@gmail.com'),
('Jonathan', 'Xavier@hotmail.com'),
('Jonathan', 'Jonathan@hotmail.com'),
('Xavier', 'Jonathan@hotmail.com')
;
使用您的查询将返回:
1 Jonathan Jonathan@gmail.com
2 Jonathan Xavier@gmail.com
AND运算符指定必须满足两个条件。
查看此demo,它将帮助您了解AND运算符的工作原理
答案 2 :(得分:0)
我认为这是MySQL中使用的布局:
SELECT * FROM addresses
WHERE (addresses.name LIKE '%Jonathan%' || addresses.domain LIKE '%Jonathan%') &&
(addresses.name LIKE '%gmail%' || addresses.domain LIKE '%gmail%')
答案 3 :(得分:0)
我认为你想要的是OR。
你将UNION与AND混淆。 UNION表示将一个查询的结果与另一个查询的结果组合在一起。用英语,“找我A找我B”。
但SQL中的术语AND表示逐行条件匹配。找到符合此条件的行并匹配其他条件。
如果您想查询Jonathan的行和gmail.com的行,只需使用OR:
SELECT * FROM addresses
WHERE addresses.name LIKE '%Jonathan%' OR addresses.domain LIKE '%Jonathan%'
OR addresses.name LIKE '%gmail' OR addresses.domain LIKE '%gmail%'