【问题标题】:SQL - AND statementsSQL - AND 语句
【发布时间】:2015-01-18 14:03:17
【问题描述】:

我有table1:

我需要知道enum 是谁,他们只知道 HTML 和 ACCESS。这怎么可能?

我试过了:

SELECT enum
FROM table1 
WHERE package="ACCESS" AND package="HTML" 

但它没有给我任何答复,我确信应该有...

提前致谢

【问题讨论】:

  • 是的,但是....我需要那个只知道 HTML 和 ACCESS 的人。如果他知道一个,那还不够。 ://
  • 你的意思是你想要只有HTMLACCESSenum?您是否只想同时返回枚举而不返回其他任何内容?如果是这样,那么您的任何示例数据都不会匹配。
  • 可能duplicate

标签: mysql sql


【解决方案1】:

您需要比较不同行中的值,使其成为“set-within-sets”子查询。这是使用group byhaving 的解决方案:

select `enum`
from table1
group by `enum`
having sum(package = 'ACCESS') > 0 and
       sum(package = 'HTML') > 0;

having 子句中的每个条件都在计算每个值的匹配数。因为你想要两者,> 0 确保enum 至少有一个。

请注意,我已将 enum 放在反引号中。 Enum 是 MySQL 中的关键字。即便如此,也不需要反引号,因为它是解析器允许不带反引号的少数此类词之一。不过,在这种情况下看到这个词看起来很奇怪,因此是反引号。

【讨论】:

  • (所以,这不是保留字!?!)
【解决方案2】:

您将阅读表格并按枚举分组,然后查看您是否获得了 所有 所需的包和 none 该枚举的其他包。

select enum
from table1
group by enum
having sum(package in ('ACCESS', 'HTML')) = 2
and sum(package not in ('ACCESS', 'HTML')) = 0
and count(*) = 2;

HAVING 子句中的三个条件之一是多余的。删除你最喜欢的那个:-)

查询利用了 MySQL 的特性,真表达式的值为 1,假表达式的值为 0,因此您可以使用 SUM 来计算真表达式。

【讨论】:

  • 为什么要包括多余的条件?
  • @bluefeet:我想展示选项。使用三个条件中的哪两个并不重要。这是一个品味问题。但是考虑删除哪个甚至可能有助于理解表达式的实际作用:-)
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2019-08-31
  • 2012-11-25
  • 2015-07-26
  • 1970-01-01
相关资源
最近更新 更多