如果在WHERE mysql查询中

时间:2018-10-12 14:12:21

标签: php mysql

我有这张桌子。

enter image description here

在MySql中,我想选择此用户IF key列没有custom行并且IF key列没有custom行-> value列= yes

这是我的查询,但不起作用:

where `value` = if(`key` = 'custom', 'yes', '')

2 个答案:

答案 0 :(得分:2)

您可以使用以下语句,选择任何行中key不等于'custom'或等于'custom'value等于'yes'

Select * from tableName where `key`<> 'custom' or  (`key` = 'custom' and  `value` = 'yes')

答案 1 :(得分:0)

该查询的规范尚不清楚,因为它可以接受几种不同的解释。

我在考虑的问题是如何返回特定结果,而不是真正地在IF()子句中使用WHERE函数。 (下面的SQL都不在IF()子句中使用WHERE函数。)


以下是该规范的一种可能解释:

通过“选择此用户”,我们将其表示要返回user_id列的单个副本。

通过“ IF键列没有自定义行”,我们将其表示该user_id不存在这样的行,然后返回此user_id。如果确实存在这样的行,则不要返回用户。

通过“ AND IF键列具有自定义行->值列= yes。”,我们认为如果该user_id的行符合条件,则返回该user_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子句中的user_id进行计数。

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
                 )

如果目的是返回用户的所有详细信息行,但排除所有符合规范的user_id,则可以使用EXISTS相关子查询:

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