mySQL:根据键/值表中的几个键进行选择


mySQL: selecting based on several keys in key/value table

我正在使用Wordpress并尝试从我自己的一个表中选择与本机wp_postmeta表中的值相对应的值。

我的表被称为"祝福表",我想从祝福者表中找到所有 ID(所以我可以计算它们),其中......

1) 祝福者"关联ID"字段在wp_postmeta post_id

2)祝福者表"关联作者ID"与$userID变量相同

3)好心人的"许可"正在等待中

4)"状态"wp_postmeta meta_key不等于meta_value"开放"

5)"冻结"wp_postmeta meta_key不等于meta_value"冻结"

我已经走到了这一步...

    "SELECT DISTINCT wellwisher.ID FROM wellwishertable wellwisher 
    INNER JOIN wp_postmeta ON (wellwisher.associatedID = wp_postmeta.post_id) 
    INNER JOIN wp_postmeta AS mt1 ON (wp_postmeta.post_id = mt1.post_id) 
    INNER JOIN wp_postmeta AS mt2 ON (wp_postmeta.post_id = mt2.post_id) 
    WHERE wellwisher.associatedAuthorID=".$userID." 
    AND wellwisher.permission ='pending' 
    AND ( (mt1.meta_key = 'status' AND mt1.meta_value != 'open') AND 
          (mt2.meta_key = 'freeze' AND mt2.meta_value != 'frozen') );

这似乎"几乎"有效,除了它不计算wp_postmeta表中没有"冻结"meta_key的记录。我希望它计算任何未"冻结"的记录,无论它是否存在(只要"状态"不是"打开"的)。

有人可以指出我正确的方向吗?

mt2上使用LEFT JOIN而不是INNER JOIN,因为INNER JOIN只会返回在那里有条目的结果。

为了避免要求mt2.meta_key总是必须等于freeze,请将该条件上移到连接中的ON子句。

您还可以考虑直接在查询中使用COUNT,而不是稍后再弄清楚:

"SELECT COUNT(DISTINCT wellwisher.ID) FROM wellwishertable wellwisher 
INNER JOIN wp_postmeta ON (wellwisher.associatedID = wp_postmeta.post_id) 
INNER JOIN wp_postmeta AS mt1 ON (wp_postmeta.post_id = mt1.post_id) 
LEFT JOIN wp_postmeta AS mt2 ON (wp_postmeta.post_id = mt2.post_id) 
    AND mt2.meta_key = 'freeze'
WHERE wellwisher.associatedAuthorID=".$userID." 
AND wellwisher.permission ='pending' 
AND ( (mt1.meta_key = 'status' AND mt1.meta_value != 'open') AND 
      (mt2.meta_value != 'frozen') );

重要:$userID直接转储到查询字符串中可能是一个很大的安全问题。请考虑使用参数化查询。