基于2列(meta_键和meta_值)过滤MySQL语句
我使用下面的SQL语句根据wp_posteta、wp_post和wp_user表计算几个字段。我需要的是只包含结果,其中所有帖子都有meta_key='key1'和meta_value>='1.5'。我在下面的声明中尝试过,但它没有过滤,仍然显示每条记录 非常感谢您的帮助基于2列(meta_键和meta_值)过滤MySQL语句,mysql,wordpress,Mysql,Wordpress,我使用下面的SQL语句根据wp_posteta、wp_post和wp_user表计算几个字段。我需要的是只包含结果,其中所有帖子都有meta_key='key1'和meta_value>='1.5'。我在下面的声明中尝试过,但它没有过滤,仍然显示每条记录 非常感谢您的帮助 SELECT (display_name) AS 'user', SUM(Case When meta_key = 'status' Then meta_value = 'won' else Null End) AS
SELECT (display_name) AS 'user',
SUM(Case When meta_key = 'status' Then meta_value = 'won' else Null End) AS 'Won',
SUM(Case When meta_key = 'status' Then meta_value = 'lost' else Null End) AS 'Lost',
COUNT(Case When meta_key = 'odd' Then meta_value else Null End) AS 'Total',
ROUND (AVG(Case When meta_key = 'odd' Then meta_value else Null End), 2) AS 'Avg odd',
ROUND (AVG(Case When meta_key = 'bet' Then meta_value else Null End), 2) AS 'Avg bet',
ROUND (SUM(Case When meta_key = 'balance' Then meta_value else Null End), 2) AS 'Balance'
FROM wp_postmeta pm
INNER JOIN wp_posts p ON pm.post_id = p.ID
INNER JOIN wp_users u ON p.post_author = u.ID
WHERE Month(post_date) = MONTH(CURRENT_DATE) AND p.post_status='publish'
GROUP BY (display_name)
HAVING SUM(CASE WHEN pm.meta_key='key1' AND pm.meta_value >='1.5' THEN 1 ELSE 0 END) > 0
ORDER BY Balance DESC
我会多次加入post元表。这应该利用索引来更快地返回查询。如果两个用户具有相同的
display\u name
,您可能需要按u.ID
进行分组。使用$wpdb->posts
和$wpdb->postmeta
是一个好主意,以防您更改数据库前缀,这是一个安全性好主意
注意,这是未经测试的
嗨,我注意到一件事。在您的实际设计中,pm.meta_值是字符串还是数字?您好,谢谢您的回复。我无法使上述陈述起作用。我想用phpmyadmin中的这个语句来获取排名。我收到一个错误,说“组函数的使用无效”。此外,meta_键'key1'实际上是meta_键'odd',不确定这是否有任何区别。谢谢,我得到-#1054-未知列“on子句”中的“win.status”。谢谢,它现在正在工作,但没有过滤。我试图从查询中排除任何meta_key=odd,meta_值>=1.5的帖子,但它们没有被排除。这就是为什么
有SUM(odd.meta_值)>=1.5
应该适合你-你可能需要CAST
?除非你的意思是你不想在sums/avgs中包含奇数.meta\u值小于1.5的任何东西,在这种情况下,你应该把它放在JOIN
SELECT
display_name user,
IFNULL(SUM(won.meta_value),0) won,
IFNULL(SUM(lost.meta_value),0) lost,
IFNULL(COUNT(odd.meta_value),0) total,
IFNULL(ROUND(AVG(odd.meta_value),2),0) avg_odd,
IFNULL(ROUND(AVG(bet.meta_value),2),0) avg_bet,
IFNULL(ROUND(SUM(balance.meta_value),2),0) balance
FROM {$wpdb->posts} p
JOIN {$wpdb->users} u
ON p.post_author = u.ID
JOIN {$wpdb->postmeta} odd
ON p.ID = odd.post_id AND odd.meta_key = 'odd'
LEFT JOIN {$wpdb->postmeta} won
ON p.ID = won.post_id AND won.meta_key = 'status' AND won.meta_value = 'won'
LEFT JOIN {$wpdb->postmeta} lost
ON p.ID = lost.post_id AND lost.meta_key = 'status' AND lost.meta_value = 'lost'
LEFT JOIN {$wpdb->postmeta} bet
ON p.ID = bet.post_id AND bet.meta_key = 'bet'
LEFT JOIN {$wpdb->postmeta} balance
ON p.ID = balance.post_id AND balance.meta_key = 'balance'
WHERE
MONTH(p.post_date) = MONTH(CURRENT_DATE)
AND p.post_status = 'publish'
GROUP BY u.ID
HAVING SUM(odd.meta_value) >= 1.5
ORDER BY balance DESC