有没有办法选择值不存在的规范化数据

时间:2015-03-26 10:24:00

标签: mysql sql database wordpress

我有一个来自Wordpress的表,wp_commentmeta,我试图让用户喜欢评论。看起来像这样

+---------+------------+-----------------------+---------------------+
| meta_id | comment_id | meta_key              | meta_value          |
+---------+------------+-----------------------+---------------------+
|      23 |          6 | like                  | 2                   |
|      31 |          8 | like                  | 1                   |
|      32 |          6 | like                  | 1                   |
+---------+------------+-----------------------+---------------------+

我知道如何获得用户2喜欢的评论

SELECT * FROM `wp_commentmeta` WHERE meta_key="like" AND meta_value=2

但我想知道的是;是否可以构建一个select语句,以便我只获得用户2不喜欢的注释,以便输出如下所示?

+---------+------------+----------+------------+
| meta_id | comment_id | meta_key | meta_value |
+---------+------------+----------+------------+
|      31 |          8 | like     |  -         |
+---------+------------+----------+------------+

2 个答案:

答案 0 :(得分:1)

是。您可以使用聚合和having子句:

select comment_id
from wp_commentmeta
where meta_key = 'like'
group by comment_id
having sum(meta_value = 2) = 0;

sum()子句中的having计算用户2的喜欢数量。 = 0表示没有。

注意:这只会选择喜欢但不喜欢的评论2.如果您还想要从不喜欢的评论,那么您需要以某种方式提供评论列表。您的问题没有足够的信息来解决这种变化。

答案 1 :(得分:1)

你可以用聚合来做到这一点,但最有可能的是它会更慢。这是一个NOT EXISTS

的例子
 SELECT
    *
 FROM
    wp_commentmeta c
 WHERE
    meta_key = "like"
    AND NOT EXISTS ( SELECT
                        1
                     FROM
                        wp_commentmeta c1
                     WHERE
                        c1.metavalue = 2
                        AND c1.comment_id = c.comment_id
                        AND meta_key = "like" )