这个查询的规范并不清楚,因为它有几种不同的解释。 我想问题是如何返回一个特定的结果,而不是使用 IF() 在 WHERE 条款(下面的sql都不使用 IF() 函数 WHERE 条款。) 以下是对规范的一种可能解释: 通过“选择此用户”,我们将其理解为希望返回 user_id 列。 通过“如果键列没有自定义行”,我们认为这意味着这个用户id不存在这样的行,然后返回这个用户id。如果这样的行存在,那么不返回用户id。 通过“and if key column have custom row->value column=yes”,我们将认为这意味着,如果此用户id有一行与条件匹配,则返回此用户id。 基于这种解释,下面是一种使用条件聚合来满足规范的方法:
SELECT t.user_id
FROM this_table t
GROUP
BY t.user_id
HAVING SUM(1) = SUM(IF(t.key='custom',IF(t.value='yes',1,0),1))
sum()聚合中的表达式将为每一行求值。该表达式被设计为返回1或0,具体取决于行是否匹配指定的条件。这个 SUM() 把这些1和0加起来。然后我们将结果与总行数进行比较。它告诉我们是否存在“匹配”行。 计数是按用户标识进行的,如 GROUP BY 条款。 mysql IF() 函数可以替换为一个更便携的ansi CASE 表达
HAVING SUM(1) = SUM(CASE
WHEN t.key = 'custom'
THEN CASE
WHEN t.value = 'yes'
THEN 1
ELSE 0
END
ELSE 1
END
)
SELECT t.user_id
, t.key
, t.value
FROM this_table t
WHERE NOT EXISTS ( SELECT 1
FROM this_table r
WHERE r.user_id = t.user_id
AND r.key = 'custom'
)
OR EXISTS ( SELECT 1
FROM this_table q
WHERE q.user_id = t.user_id
AND q.key = 'custom'
AND q.value = 'yes'
)
您可以使用下面的语句来选择任何行 key 不相等 'custom' 或同等 'custom' 以及 value 相等 'yes' ``` Select * from tableName where key<> 'custom' or (key = 'custom' and value = 'yes')
2条答案
按热度按时间ecbunoof1#
这个查询的规范并不清楚,因为它有几种不同的解释。
我想问题是如何返回一个特定的结果,而不是使用
IF()
在WHERE
条款(下面的sql都不使用IF()
函数WHERE
条款。)以下是对规范的一种可能解释:
通过“选择此用户”,我们将其理解为希望返回
user_id
列。通过“如果键列没有自定义行”,我们认为这意味着这个用户id不存在这样的行,然后返回这个用户id。如果这样的行存在,那么不返回用户id。
通过“and if key column have custom row->value column=yes”,我们将认为这意味着,如果此用户id有一行与条件匹配,则返回此用户id。
基于这种解释,下面是一种使用条件聚合来满足规范的方法:
sum()聚合中的表达式将为每一行求值。该表达式被设计为返回1或0,具体取决于行是否匹配指定的条件。这个
SUM()
把这些1和0加起来。然后我们将结果与总行数进行比较。它告诉我们是否存在“匹配”行。计数是按用户标识进行的,如
GROUP BY
条款。mysql
IF()
函数可以替换为一个更便携的ansiCASE
表达如果要返回某个用户的所有详细信息行,但不包括符合规范的所有用户标识,则可以使用exists关联子查询:
vmjh9lq92#
您可以使用下面的语句来选择任何行
key
不相等'custom'
或同等'custom'
以及value
相等'yes'
```Select * from tableName where
key
<> 'custom' or (key
= 'custom' andvalue
= 'yes')