【问题标题】:Filter users using by two different user meta按两个不同的用户元过滤用户
【发布时间】:2021-01-29 11:36:47
【问题描述】:

我有一个名为 country(字符串)的用户元字段和另一个名为 is_blocked(二进制)的用户元字段。我需要的是返回选择用户注册日期的每个国家/地区的未阻止用户数。

通过这个查询,我设法在不考虑 is_blocked 字段的情况下获取值:

SELECT meta_value AS 'country', COUNT(meta_value) AS 'total'
FROM wp_usermeta INNER JOIN
     wp_users
     ON wp_usermeta.user_id = wp_users.ID
WHERE meta_key = 'user_country' AND
      meta_value <> '' AND 
      DATE_FORMAT(wp_users.user_registered, '%Y-%m') = '2021-01'
GROUP BY meta_value
ORDER BY total DESC

但我不能只选择非阻塞用户。我的尝试:

SELECT meta_value AS 'country', COUNT(meta_value) AS 'total'
FROM wp_usermeta INNER JOIN
     wp_users
     ON wp_usermeta.user_id = wp_users.ID
WHERE meta_key = 'user_country' AND
      meta_value <> '' AND 
      DATE_FORMAT(wp_users.user_registered, '%Y-%m') = '2021-01' AND
     (wp_usermeta.meta_key = 'user_blocked' AND
      CAST(wp_usermeta.meta_value AS BINARY) != '1'
     )
GROUP BY meta_value
ORDER BY total DESC

【问题讨论】:

  • 请提供样本数据和期望的结果。定义“被阻止的用户”。

标签: mysql sql wordpress


【解决方案1】:

您需要另一个join 或存在:

SELECT umc.meta_value AS country, COUNT(umb.user_id) AS total
FROM wp_users u INNER JOIN
     wp_usermeta umc
     ON umc.user_id = u.ID AND
        umc.meta_key = 'user_country' AND
        umc.meta_value <> '' LEFT JOIN
     wp_usermeta umb
     ON umb.user_id = u.ID AND
        umb.meta_key = 'user_blocked' AND
        CAST(umb.meta_value AS BINARY) <> '1'
WHERE DATE_FORMAT(u.user_registered, '%Y-%m') = '2021-01'
GROUP BY umc.meta_value
ORDER BY total DESC;

如果您的国家/地区没有未阻止的用户,这应该会为您提供 0 值。这也假设两个元键不会为单个用户重复。

【讨论】:

    【解决方案2】:

    您可以使用表wp_usermeta 中的条件聚合来获取满足您条件的每个usercountry

    SELECT user_id, 
           MAX(CASE WHEN meta_key = 'user_country' THEN meta_value END) country
    FROM wp_usermeta
    GROUP BY user_id
    HAVING country <> ''
       AND MAX(CASE WHEN meta_key = 'user_blocked' THEN meta_value END) + 0 <> 1
    

    然后将其加入表wp_users

    SELECT m.country, COUNT(*) total
    FROM wp_users u 
    INNER JOIN (
      SELECT user_id, 
             MAX(CASE WHEN meta_key = 'user_country' THEN meta_value END) country
      FROM wp_usermeta
      GROUP BY user_id
      HAVING country <> ''
         AND MAX(CASE WHEN meta_key = 'user_blocked' THEN meta_value END) + 0 <> 1
    ) m ON m.user_id = u.ID
    WHERE DATE_FORMAT(u.user_registered, '%Y-%m') = '2021-01'
    GROUP BY m.country
    ORDER BY total DESC
    

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2022-08-19
      • 2018-05-10
      • 1970-01-01
      • 2015-08-15
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      相关资源
      最近更新 更多