在MySQL中按相等值排序

在MySQL中按相等值排序,mysql,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_st

全部,, 到目前为止,我有以下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'
我有一个名为
featured
postmeta.meta\u键。然后,如果文章有特色,则其值在另一个名为
postETA.meta\u value
的列中。如果meta_value=“yes”
的meta_键等于“featured”,那么我想先显示这篇文章,然后再显示其余的文章。我该怎么做呢

编辑:以下是数据设置:


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

谢谢

很简单,如下所示:

...
ORDER BY featured = 'yes'
featured='yes'
的计算结果为布尔值true或false,对于
featured=“yes”
为true的项目,将首先出现,然后具有
featured=“yes”
的项目将为false,即
featured=“no”
的项目将随后出现

更新: 您可以使用
order by
子句中的语句在单独的字段中对数据进行排序,例如:

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
您可能需要在
CASE
语句的
ELSE
部分添加另一个orderby条件,以对具有
meta_key='特征的项目进行排序

如果字段
metadata\u key
始终为
=“特色”
,则可以去掉case语句,只使用
orderbymeta\u value=“yes”DESC

SELECT ...
FROM   ...
ORDER BY (meta_key='featured' AND meta_value='yes') DESC, postid ASC;

如果一行的
(meta_key='featured'和meta_value='yes')
,则该行的值为1/TRUE。否则,它将具有0/FALSE。因此,降序排序会将具有TRUE的行放在第一位。

此外,您还可以使用名为

FIELD(HAYSTACK, value[, ...values]).
此函数返回草堆索引的值(从1到n,0-如果未找到)

示例

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

但是,在你的例子中,使用数学的.coffee例子。在我的示例中,您需要重复列表末尾的字段名,因为如果不重复,它将返回0(零),并且列表中的元素将在结果语句中位于第一位。

谢谢,我稍微更新了我的问题。我想我问得不对。这是最新消息:我有一个posteta.meta_键,名为featured。然后,如果文章有特色,则其值在另一个名为postmeta.meta_value的列中。如果meta_value=“yes”,其中meta_键等于“featured”,那么我想先显示这篇文章,然后再显示其余的文章。我该怎么做呢?里面有AND条款吗?让我用一些数据更新我的问题,希望能让您更好地理解DB结构。@user1048676,您可以添加
子句,但您不需要,因为
CASE
语句将首先确保
meta_key=featured
。或者您可以删除案例并将其添加到
条件中。我用生成的SQL再次更新了我的问题。出于某种原因,它没有按功能分类。我认为这是因为它是根据我的邮政编码选择记录,而不是选择所有记录然后进行排序。这有意义吗?@user1048676,顺便说一句:你可以用
where wp_postETA.meta_value in('value1','value2',…)
代替这些
。我用正在生成的SQL再次更新了我的问题。出于某种原因,它没有按功能分类。我认为这是因为它是根据我的邮政编码选择记录,而不是选择所有记录然后进行排序。这有意义吗?您的SQL看起来很好,我给出的SQL也可以工作——当我创建表foo时(id INT,meta_key VARCHAR(10),meta_value VARCHAR(10))
插入到foo值中(123,'featured','yes'),(324,'featured','no'),(182,'featured','yes'),(873,'featured','yes')(您在问题中提供的数据),并在我的回答中使用
SELECT*
ORDER BY
,它会给出所需的输出。另外,您只选择满足
的行,其中wp\u postETA.meta\u key='zip'
,所以你不能按
wp\u posteta.meta\u key='featured'
排序,因为没有-我想这就是你想说的?你是对的,我刚刚想好了,打算在这里发帖。我需要添加另一个OR语句来选择特征变量。它现在正在工作。谢谢你的主意!