1

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

    从 _posts 中选择 SQL_CALC_FOUND_ROWS _posts.ID
    内部连接 ​​_postmeta ON (_posts.ID = _postmeta.post_id)
    其中 1=1
    AND _posts.post_type = '狗'
    和(_posts.post_status = '发布')
    AND ( (_postmeta.meta_key = '_meta_general'
       AND CAST(_postmeta.meta_value AS CHAR)) 作为 dmet
       AND POSITION(';s:6:\"weight' IN dmet) 作为 ddex
       AND MID(dmet ,ddex,10)) 作为 dres
    GROUP BY DRES ORDER BY DRES ASC LIMIT 0, 10

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

这些都没有按我的意愿工作。存在语法错误。代码的目的是按序列(json)字符串中的值对返回的查询进行分组。方法是搜索以下值(在这种情况下它将是 - ";s:6:"weight -)当我有这个字符串的索引时,我想返回前面的 10 个值(日期 xx/xx/ xxx)。我想标记这个字符串(AS dres)并让结果按 dres 排序。Wordpress 从帖子表中收集帖子,然后从 postmeta 表中收集帖子元数据。后元表是存储 json 的位置。这真的是一个简单的算法,它只是让我感到困惑的语法。

    SELECT SQL_CALC_FOUND_ROWS {$wpdb->posts}.ID
    FROM {$wpdb->posts} 内连接 {$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
    开启({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)
    其中 1=1
    和 {$wpdb->posts}.post_type = 'dog'
    AND ({$wpdb->posts}.post_status = 'publish')
    和 {$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

4

1 回答 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
于 2013-02-24T20:55:24.313 回答