首页 文章

Wordpress使用自定义查询搜索序列化元数据

提问于
浏览
1

我正在尝试在wordpress数据库中搜索序列化的post元值 . 我知道串行字符串的结构,所以我可以搜索前面的值,获取索引,然后在索引值之前获取我想要的字符数 . 我不能在这个特定的查询中有效地使用regexp,因为我想根据结果进行排序 . 这是我到目前为止所做的,但是我在语法上失败了,我认为它与尝试使用AS关键字和我对AND语句进行分组有关 .

SELECT SQL_CALC_FOUND_ROWS _posts.ID FROM _posts 
    INNER JOIN _postmeta ON (_posts.ID = _postmeta.post_id)
    WHERE 1=1
    AND _posts.post_type = 'dog' 
    AND (_posts.post_status = 'publish') 
    AND ( (_postmeta.meta_key = '_meta_general'
       AND CAST(_postmeta.meta_value AS CHAR)) AS dmet 
       AND POSITION(';s:6:\"weight' IN dmet) AS ddex 
       AND MID(dmet ,ddex,10)) AS dres 
    GROUP BY dres ORDER BY dres ASC LIMIT 0, 10

好吧,我仍然对这件事的结构有疑问 . 经过仔细检查,之前的代码没有用,@ fenway . 这就是我现在拥有的 . @ fenway回答的问题是MID和POSITION值是在选择“FROM”帖子的语句的select部分中调用的 . 它们位于postmeta . 所以我试图在INNER JOIN之后重新排列字符串过滤,它通过id将postmeta表连接到posts表 . 这不起作用 . 我知道这个问题仅仅是因为我缺乏SQL知识,但我想在这里学习 .

这些都不是我想要的 . 有语法错误 . 代码的目的是通过串行(json)字符串内的值对返回的查询进行分组 . 该方法是搜索以下值(在这种情况下,它将是 - “; s:6:”权重 - )当我有这个字符串的索引时,我想返回前面的10个值(日期xx / xx / xxxx) . 我想标记这个字符串(AS dres)并按dres排序结果 . Wordpress从posts表中收集帖子,然后从postmeta表中收集post meta . post元表是存储json的地方 . 它实际上是一个简单的算法,只是语法与我紧密相连 .

SELECT SQL_CALC_FOUND_ROWS {$wpdb->posts}.ID 
    FROM {$wpdb->posts} INNER JOIN {$wpdb->postmeta} 
    MID(CAST({$wpdb->postmeta}.meta_value AS CHAR), 
    POSITION(';s:6:\"weight' IN CAST({$wpdb->postmeta}.meta_value AS CHAR) ),10 ) AS dres 
    ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id) 
    WHERE 1=1 
    AND {$wpdb->posts}.post_type = 'dog'
    AND ({$wpdb->posts}.post_status = 'publish') 
    AND {$wpdb->postmeta}.meta_key = '_meta_general' 
    AND POSITION(';s:6:"weight' IN CAST({$wpdb->postmeta}.meta_value AS CHAR)) > 0 
    GROUP BY {$wpdb->posts}.ID ORDER BY dres ASC LIMIT 0, 10

1 回答

  • 1

    你不能在你的WHERE子句中使用列别名 - 在某些情况下,那些总是求值为TRUE的表达式,所以我不明白为什么会有这些 .

    也许你的意思是:

    SELECT SQL_CALC_FOUND_ROWS 
    _posts.ID
    ,MID(
       CAST(_postmeta.meta_value AS CHAR),
       POSITION(';s:6:\"weight' IN CAST(_postmeta.meta_value AS CHAR) ),
       10
    ) AS dres  
    FROM _posts 
    INNER JOIN _postmeta ON (_posts.ID = _postmeta.post_id)
    WHERE 1=1
    AND _posts.post_type = 'dog' AND _posts.post_status = 'publish'
    AND _postmeta.meta_key = '_meta_general'
    AND POSITION(';s:6:\"weight' IN CAST(_postmeta.meta_value AS CHAR)) > 0
    GROUP BY dres ORDER BY _postmeta.meta_value ASC LIMIT 0, 10
    

相关问题