1

这是我的查询:

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子句之后的部分没有命中任何内容,结果是否会因为它被添加为AND语句而为空?在这个例子中,我试图抓住所有地址为 Jonathan 的人,而每个 Jonathan 的地址为 gmail 的人。但是,如果让我们说在这个例子中 gmail 不存在任何名为 Jonathan 的人,我想要所有 Jonathan 结果(这就是我认为使用 AND 语句不起作用的原因)我可能没有正确措辞。

谢谢

4

4 回答 4

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 等域的人。

于 2013-06-01T21:13:27.623 回答
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 运算符指定必须满足这两个条件。

看看这个演示,它将帮助您了解 AND 运算符的工作原理

于 2013-06-01T21:19:58.793 回答
0

我认为这是 MySQL 中使用的布局:

SELECT * FROM addresses 
WHERE (addresses.name LIKE '%Jonathan%' || addresses.domain LIKE '%Jonathan%') && 
(addresses.name LIKE '%gmail%' || addresses.domain LIKE '%gmail%')
于 2013-06-01T21:15:43.557 回答
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%'
于 2013-06-01T21:19:13.500 回答