我正在尝试在 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