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

时间:2013-02-24 20:40:21

标签: mysql wordpress serialization

我正在尝试在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 个答案:

答案 0 :(得分: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
相关问题