在MySQL中ORDER BY一个相等的值

时间:2012-02-23 00:56:35

标签: mysql

全部, 到目前为止,我有以下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

谢谢!

3 个答案:

答案 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