instr()的排序SQL结果不符合预期

时间:2018-06-12 13:14:09

标签: mysql

当我查询时,我有一个主索引的表:

$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),
           ),
        )
    );

排序是这样的: This is returned by query 1

如果我尝试其他查询:

SELECT * FROM `chemical` WHERE name LIKE '%copper%' ORDER BY name ASC

结果如下: This is returned by query 2

我真的不明白为什么排序第二个结果会变成这样,至少我希望这个名字带有'(II)'要坚持到一起并且“铜”#39;像这样留在顶端:

这是用于插图的EDITED JPEG。 This is edited JPEG

我的问题是:

1)instr()的排序算法是什么,它使结果出现在第二张图片中?

2)有什么方法可以查询实现图3的结果吗?

2 个答案:

答案 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')返回0INSTR('AAS Standard Copper', 'Copper')返回14,因此INSTR('AAS Standard Copper', 'Copper') <> 1返回false(0)。< / p>

答案 1 :(得分:0)

按名称排序,因此按字母顺序排列关系:

ORDER BY INSTR(name, 'copper') ASC, name

这与ojones的答案有所不同,因为它在所有情况下都会提前移动最早的铜实例,而不仅仅是那些以单词开头的名称。