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