当我查询时,我有一个主索引的表:
$args = array(
'post_type' =>'post',
'posts_per_page' =>'1',
'post_status' =>'publish',
'orderby' => 'date',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => explode(",",$category),
),
)
);
如果我尝试其他查询:
SELECT * FROM `chemical` WHERE name LIKE '%copper%' ORDER BY name ASC
我真的不明白为什么排序第二个结果会变成这样,至少我希望这个名字带有'(II)'要坚持到一起并且“铜”#39;像这样留在顶端:
我的问题是:
1)instr()的排序算法是什么,它使结果出现在第二张图片中?
2)有什么方法可以查询实现图3的结果吗?
答案 0 :(得分:1)
INSTR()
返回一个数字,显示字符串中子字符串开头的位置。因此,INSTR('Copper', 'Copper')
和INSTR('Copper (II) Sulfate', 'Copper')
都返回1.因此,具有这些项的行将被排序,就好像它们是相同的一样。 MySQL和所有DBMS系统以不可预测的顺序对相同的项进行排序。
您可能需要ORDER BY INSTR(name, 'copper') <> 1, name
。这将首先以Copper
开头的名称,否则按字母顺序对名称进行排序。为什么这样做?
input ----------------sort keys----------
name INSTR(name, 'copper') <> 1 name
Copper 0 Copper
Copper (II) Oxide 0 Copper (II) Oxide
AAS Standard Copper 1 AAS Standard
Vanadium Oxide 1 Vanadium Oxide
在ORDER BY子句中,MySQL将布尔值解释为0和1. INSTR('Vanadium Oxide', 'Copper')
返回0
,INSTR('AAS Standard Copper', 'Copper')
返回14,因此INSTR('AAS Standard Copper', 'Copper') <> 1
返回false(0)。< / p>
答案 1 :(得分:0)
按名称排序,因此按字母顺序排列关系:
ORDER BY INSTR(name, 'copper') ASC, name
这与ojones的答案有所不同,因为它在所有情况下都会提前移动最早的铜实例,而不仅仅是那些以单词开头的名称。