在WHERE子句SQL查询中使用AND之间的CASE语句

时间:2014-06-12 18:57:29

标签: mysql sql wordpress where-clause

我写了一个查询,如下 -

SELECT user_id, display_name, user_email, meta_key, meta_value 
FROM wp_usermeta um INNER JOIN wp_users u ON um.user_id = u.id 
WHERE 
CASE 
WHEN meta_key = "renewal_date" THEN meta_value = "a"
WHEN meta_key = "wp_user_level" THEN meta_value <> "10"
END

我需要两个'user_id'语句中的when相等。我的意思是,如果相同的用户(具有相同的user_id)具有meta_key作为renewal_date并且相应的meta_value作为a,并且同一用户具有作为wp_user _level的meta_key并且具有相应的meta_value作为10则则他不应该在结果列表中显示。由于我对SQL的了解有限,我考虑在WHEN语句之间使用AND,但它给了我一个语法错误。

1 个答案:

答案 0 :(得分:0)

根据您的描述,我想我会看到您要做的事情,但您的查询将无法正常运行。看起来wp_usermeta表中每个用户ID有几行。这被称为EAV模型(entity-attribute-value),该模型使报告非常困难,因为您的行应该是列。

使其工作的一种方法是多次加入wp_usermeta表(因此行基本上成为列),如下所示:

SELECT u.id, u.display_name, u.user_email, 
  rd.meta_value AS renewal_date, ul.meta_value AS wp_user_level
FROM wp_users u
LEFT JOIN wp_usermeta rd ON rd.user_id=u.id AND rd.meta_key='renewal_date'
LEFT JOIN wp_usermeta ul ON ul.user_id=u.id AND ul.meta_key='wp_user_level'
WHERE rd.meta_value = 'a'
AND ul.meta_value <> '10'

请注意,没有“wp_user_level”数据的用户将包含在此报告中。如果您需要过滤掉那些,可以用INNER JOIN替换LEFT JOIN。