【问题标题】:mySQL: selecting based on several keys in key/value tablemySQL:基于键/值表中的几个键进行选择
【发布时间】:2015-04-01 22:36:52
【问题描述】:

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

我的表被称为“wellwishertable”,我想从 Wellwisher 表中找到所有 ID(以便我可以计算它们)...

1) wellwishertable 'associatedID' 字段在 wp_postmeta post_id 中

2) wellwishertable 'associatedAuthorID' 与 $userID 变量相同

3) 良好的“许可”正在等待中

4) wp_postmeta meta_key 'status' 不等于 meta_value 'open'

5) wp_postmeta meta_key 'freeze' 不等于 meta_value 'frozen'

我已经走了这么远......

    "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 表中没有“冻结”元键的记录。我希望它计算任何未“冻结”的记录,无论它是否存在(只要“状态”不是“打开”)。

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

【问题讨论】:

    标签: php mysql wordpress


    【解决方案1】:

    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 直接转储到查询字符串中可能是一个很大的安全问题。请考虑使用parameterized queries

    【讨论】:

    • 这看起来非常好,谢谢。但是仍然存在一个小问题,似乎如果没有 meta_key 值“freeze”,那么它就不算数(即,如果没有 freeze 的 meta_key,我希望它算作一条不存在的记录) t 匹配“冻结”)。有什么可以改变的来使这项工作吗?谢谢:-)
    • @JohnT 对不起,错过了。请查看我是如何将mt2.meta_key = 'freeze' 向上移动到JOIN 子句中的。现在mt2.meta_value != 'frozen' 应该在没有记录时通过。
    • 很棒的东西现在很受欢迎。谢谢! :-) 感谢您提供有关查询中变量的提示。用户 ID 是由我生成的,但在将数据放入查询之前对数据进行清理非常重要。再次感谢:-)
    • 哎呀可能说得太早了。当“冻结”设置为“冻结”时效果很好,但在没有“冻结”元密钥时仍然不起作用?即使“状态”不是“打开”,如果没有“冻结”元密钥,我也没有得到任何结果?还有其他想法吗...?我可能会重新编写以始终拥有一个“冻结”键,但如果有办法通过查询来实现它会很好吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2013-03-21
    • 2011-06-11
    相关资源
    最近更新 更多