【问题标题】:Filter MySQL statement based on 2 columns (meta_key and meta_value)根据 2 列(meta_key 和 meta_value)过滤 MySQL 语句
【发布时间】:2013-04-08 05:08:21
【问题描述】:

我有以下 SQL 语句来计算基于 wp_postmeta、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 '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

【问题讨论】:

  • 嗨,我注意到了一些事情。 pm.meta_value 在您的实际设计中是字符串还是数字?

标签: mysql wordpress


【解决方案1】:

我会多次加入帖子元表。这也应该利用索引来更快地返回查询。您可能希望按u.ID 分组,以防两个用户拥有相同的display_name。使用$wpdb->posts$wpdb->postmeta 是一个好主意,以防您更改数据库前缀,这对安全来说是个好主意。

注意,这是未经测试的。

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

【讨论】:

  • 您好,感谢您的回复。我无法使上述声明起作用。我想在phpmyadmin中使用这个语句来拉一个排名。我收到一条错误消息,提示“组功能的使用无效”。此外,meta_key 'key1' 实际上是 meta_key 'odd',不确定这是否有任何区别。谢谢
  • 现在我得到 - #1054 - 'on Clause' 中的未知列 'won.status'。
  • 谢谢,它现在可以工作,但不能过滤。我正在尝试从查询中排除任何 meta_key=odd 且 meta_value>=1.5 但没有被排除的帖子。
  • 这就是HAVING SUM(odd.meta_value) >= 1.5 应该为你做的——你可能需要CAST
  • 除非你的意思是你不希望任何odd.meta_value 小于 1.5 的东西包含在 sums/avgs 中,在这种情况下你应该把它放在 JOIN
猜你喜欢
  • 2023-04-04
  • 2019-11-06
  • 2016-03-22
  • 2018-02-16
  • 2020-04-21
  • 2017-06-21
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
相关资源
最近更新 更多