计入列的子选择

时间:2015-05-28 18:06:28

标签: mysql wordpress

我需要根据子集计算用户(提供的唯一ID:user_id)。该表看起来像这样(它是一个WordPress用户元表)

mysql> describe wp_usermeta;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| umeta_id   | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id    | bigint(20) unsigned | NO   | MUL | 0       |                |
| meta_key   | varchar(255)        | YES  | MUL | NULL    |                |
| meta_value | longtext            | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

现在,用户在其用户元表中保存了一些我需要计算的设置。

mysql> select count(user_id), meta_key, meta_value 
    from wp_usermeta 
    where meta_key = 'front_page' 
    and ( meta_value in ( 'Foo', 'Bar', 'Dragons' ) ) 
    group by meta_value;
+----------------+------------+-------------+
| count(user_id) | meta_key   | meta_value  |
+----------------+------------+-------------+
|            282 | front_page | Foo         |
|           1355 | front_page | Bar         |
|            536 | front_page | Dragons     |
+----------------+------------+-------------+
3 rows in set (0.03 sec)

这是“预选”。现在,我需要找出front_page设置为哪些用户的用户,例如Foo在另一行中meta_value '1'的密钥为checked_in。例如:

where meta_key = 'checked_in' and meta_value = '1'

组合查询不是问题。我只是错过了值之间的“交集”:

select count(user_id), meta_key, meta_value 
    from wp_usermeta 
    where ( meta_key = 'front_page' or meta_key = 'checked_in' ) 
    and ( meta_value in ( 'Foo', 'Bar', 'Dragons', '1' ) ) 
    group by meta_value;
+----------------+------------+-------------+
| count(user_id) | meta_key   | meta_value  |
+----------------+------------+-------------+
|           3431 | checked_in | 1           |
|            282 | front_page | Foo         |
|           1355 | front_page | Bar         |
|            536 | front_page | Dragons     |
+----------------+------------+-------------+
4 rows in set (0.08 sec)

不知道如何进行子选择。指针欢迎。

1 个答案:

答案 0 :(得分:0)

通过执行子查询来解决这个问题很容易(也很慢)。只需获取一组user_id值,然后使用第二个查询搜索in

select distinct count(user_id), meta_key, meta_value 
from wp_usermeta 
where meta_key = 'front_page' 
    and meta_value is not null 
    and trim(meta_value) <> '' 
    and meta_value in ( 'Foo', 'Bar', 'Dragons' ) 
    and user_id in ( 
        -- this is the subquery that returns a set of `user_id`s that can be searched in
        select user_id 
        from wp_usermeta 
        where meta_key = 'checked_in' 
        and meta_value = '1' 
    ) 
    order by meta_value, user_id;