全部, 到目前为止,我有以下SQL查询:
SELECT * FROM $wpdb->posts
JOIN $wpdb->term_relationships ON $wpdb->term_relationships.object_id=$wpdb->posts.ID
JOIN $wpdb->postmeta ON $wpdb->postmeta.post_id=$wpdb->posts.ID
WHERE
$wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'post'
AND $wpdb->term_relationships.term_taxonomy_id='$vendor_category_to_use'
AND $wpdb->postmeta.meta_key='zip'
我有postmeta.meta_key
名为featured
。然后,如果帖子的特色是在另一个名为postmeta.meta_value
的列中。如果meta_key等于“特色”的meta_value = "yes"
,那么我想首先显示这个,然后显示其余的帖子。我怎么能这样做?
编辑:这是数据设置:
postid meta_key meta_value
123 featured yes
324 featured no
182 featured yes
873 featured yes
因此,在此示例中,我希望我的帖子按此顺序显示:
postid meta_key meta_value
123 featured yes
182 featured yes
873 featured yes
324 featured no
我希望有所帮助!
以下是生成的SQL:
SELECT *
FROM wp_posts
JOIN wp_term_relationships ON wp_term_relationships.object_id=wp_posts.ID
JOIN wp_postmeta ON wp_postmeta.post_id=wp_posts.ID
WHERE wp_posts.post_status = 'publish' AND wp_posts.post_type = 'post' AND wp_term_relationships.term_taxonomy_id='5' AND wp_postmeta.meta_key='zip' AND (wp_postmeta.meta_value = '46320' OR wp_postmeta.meta_value = '46321' OR wp_postmeta.meta_value = '46322' OR wp_postmeta.meta_value = '46323' OR wp_postmeta.meta_value = '46324' OR wp_postmeta.meta_value = '46327' OR wp_postmeta.meta_value = '46394' OR wp_postmeta.meta_value = '46402' OR wp_postmeta.meta_value = '46404' )
ORDER BY (wp_postmeta.meta_key='featured' AND wp_postmeta.meta_value='yes') DESC, wp_posts.post_date DESC
谢谢!
答案 0 :(得分:13)
SELECT ...
FROM ...
ORDER BY (meta_key='featured' AND meta_value='yes') DESC, postid ASC;
如果某行为(meta_key='featured' AND meta_value='yes')
,则该行的值为1 / TRUE。否则,它将具有0 / FALSE。因此,按降序排序会使行首先为TRUE。
答案 1 :(得分:2)
此外,您可以使用名为
的MySQL函数FIELD(HAYSTACK, value[, ...values]).
此函数以值(FROM 1到n,0 - 如果未找到)返回haystack的索引。
示例强>
ORDER BY FIELD(wp_postmeta.meta_key, 'featured', wp_postmeta.meta_key),
FIELD(wp_postmeta.meta_value, 'yes', wp_postmeta.meta_value), wp_posts.post_date DESC
但是,在您的情况下,请使用mathematical.coffee示例。在我的示例中,您需要在列表末尾重复字段名称,因为如果您不这样做 - 它将返回0(零),并且列表中的元素将不在结果语句中。
答案 2 :(得分:1)
这样直截了当:
...
ORDER BY featured = 'yes'
featured = 'yes'
的计算结果为布尔值true或false,对于featured = "yes"
为真的项目将首先出现,featured = "yes"
的项目为假,featured = "no"
稍后出现。< / p>
您可以在order by
子句中使用CASE
语句对特定字段中的数据进行排序,例如:
ORDER BY
CASE WHEN postmeta.meta_key = 'featured'
THEN meta_value = 'yes' DESC
END
或强>
ORDER BY ( postmeta.meta_key = 'featured' AND meta_value = 'yes') DESC
您可能需要在ELSE
语句的CASE
部分中按条件添加其他订单,以便对meta_key = 'featured
为false的项目进行排序。
如果字段metadata_key
始终为= "featured"
,那么您可以删除案例陈述并仅使用ORDER BY meta_value = 'yes' DESC