Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查找包含文本但优先选择字段开头匹配项的字段_Mysql - Fatal编程技术网

Mysql 查找包含文本但优先选择字段开头匹配项的字段

Mysql 查找包含文本但优先选择字段开头匹配项的字段,mysql,Mysql,这是一个非常简单的问题 我想查找文本字段包含文本的记录,以填充表单中的自动完成字段。挑战在于,我希望将结果限制在前20条记录,但优先考虑字段开头的匹配 我现在要做的是对字段(如“%term”)执行10次查询,然后将记录追加到字段(如“%term%”)中10次。它需要两次搜索 只需对表进行一次查询就可以做到这一点吗?按匹配项在字段中的位置排序?智能!我不知道这是否可能,但我知道你可以做得更好一点: <?php $q = 'term'; $limit = 20; $first = mysq

这是一个非常简单的问题

我想查找文本字段包含文本的记录,以填充表单中的自动完成字段。挑战在于,我希望将结果限制在前20条记录,但优先考虑字段开头的匹配

我现在要做的是对
字段(如“%term”
)执行10次查询,然后将记录追加到
字段(如“%term%”
)中10次。它需要两次搜索


只需对表进行一次查询就可以做到这一点吗?按匹配项在字段中的位置排序?

智能!我不知道这是否可能,但我知道你可以做得更好一点:

<?php

$q = 'term';
$limit = 20;

$first = mysql_query("SELECT * FROM some_table WHERE name LIKE '%$q' ORDER BY name LIMIT $limit");
$first_len = !$sql?0:mysql_num_rows($first);
$limit -= $first_len;
$second = mysql_query("SELECT * FROM some_table WHERE name LIKE '%$q%' LIMIT $limit");
$second_len = !$sql?0:mysql_num_rows($second);

if (!$first_len && !$second_len) {
    exit('No results found.');
}

function handleSearchResultRow($row) {
    echo $row['name'].'<br/>';
}

if ($first_len)
    while ($row = mysql_fetch_array($first))
        handleSearchResultRow($row);

if ($second_len)
    while ($row = mysql_fetch_array($second))
        handleSearchResultRow($row);

?>

塔达!您将得到相同的结果,但代码稍微多一点!这将确保始终有多达20个结果,结果从第一学期开始


如果您确实希望“按字段中匹配的位置排序”,那么我认为您必须创建一个包含所有结果的数组,并使用php strpos()对其进行排序。但是SQL真的很强大,而且可能也有能力做到这一点。请发布另一个答案,并告诉我您是否知道如何做到这一点。:)

聪明!我不知道这是否可能,但我知道你可以做得更好一点:

<?php

$q = 'term';
$limit = 20;

$first = mysql_query("SELECT * FROM some_table WHERE name LIKE '%$q' ORDER BY name LIMIT $limit");
$first_len = !$sql?0:mysql_num_rows($first);
$limit -= $first_len;
$second = mysql_query("SELECT * FROM some_table WHERE name LIKE '%$q%' LIMIT $limit");
$second_len = !$sql?0:mysql_num_rows($second);

if (!$first_len && !$second_len) {
    exit('No results found.');
}

function handleSearchResultRow($row) {
    echo $row['name'].'<br/>';
}

if ($first_len)
    while ($row = mysql_fetch_array($first))
        handleSearchResultRow($row);

if ($second_len)
    while ($row = mysql_fetch_array($second))
        handleSearchResultRow($row);

?>

塔达!您将得到相同的结果,但代码稍微多一点!这将确保始终有多达20个结果,结果从第一学期开始


如果您确实希望“按字段中匹配的位置排序”,那么我认为您必须创建一个包含所有结果的数组,并使用php strpos()对其进行排序。但是SQL真的很强大,而且可能也有能力做到这一点。请发布另一个答案,并告诉我您是否知道如何做到这一点。:)

是的,可以按搜索字符串的第一次出现排序。(我假设您想要编写类似“term%”的字段)

然而,这个查询很可能比字段“term%”慢得多(假设您在字段上有索引)

  • 在您的例子中,像“term%”这样的字段可以通过字段上的索引来实现,从而产生一个范围查询,但仍然很快
  • 类似“%term%”的字段限制10,如果不使用order,仍然可以快速(er)。根据搜索词和数据分布,统计速度比我编写的解决方案快2倍。原因是MySQL将开始在表中搜索“term”(这里不能使用索引)。当它找到10个元素时,它将停止。这可以在表格的开头
  • 我写的内容将导致MySQL对整个表进行完全扫描,并检查每一行的“term”,而不是对计算值进行文件排序。可能是单个表查找中可能发生的最糟糕的事情

我想说,两种版本都试试,用更快的版本。或者,如果您的数据集很大,您可以检查MySQL的全文搜索功能(MYISAM有它,InnoDB从MySQL 5.6开始也支持它)。

是的,可以按搜索字符串的第一次出现排序。(我假设您想要编写类似“term%”的字段)

然而,这个查询很可能比字段“term%”慢得多(假设您在字段上有索引)

  • 在您的例子中,像“term%”这样的字段可以通过字段上的索引来实现,从而产生一个范围查询,但仍然很快
  • 类似“%term%”的字段限制10,如果不使用order,仍然可以快速(er)。根据搜索词和数据分布,统计速度比我编写的解决方案快2倍。原因是MySQL将开始在表中搜索“term”(这里不能使用索引)。当它找到10个元素时,它将停止。这可以在表格的开头
  • 我写的内容将导致MySQL对整个表进行完全扫描,并检查每一行的“term”,而不是对计算值进行文件排序。可能是单个表查找中可能发生的最糟糕的事情
我想说,两种版本都试试,用更快的版本。或者,如果您的数据集很大,您可以检查MySQL的全文搜索功能(MYISAM有它,InnoDB从MySQL 5.6开始也支持它)。

我会:

SELECT * FROM table WHERE field LIKE '%term%' order by IF(field REGEXP '^term.*',0,1),field LIMIT 20;
我会:

SELECT * FROM table WHERE field LIKE '%term%' order by IF(field REGEXP '^term.*',0,1),field LIMIT 20;

这就是我正在做的事情。我正在寻找纯SQL解决方案,因为这只是一个排序问题。谢谢你的回答。这就是我正在做的。我正在寻找纯SQL解决方案,因为这只是一个排序问题。谢谢你的回答。我喜欢这个词,它会根据词在词中的位置来排序!!很遗憾,SQL必须评估整个表才能对其进行排序,但这是可以理解的。如果我可以用WHERE条件缩小搜索范围,那么性能可能不会成为问题。只有在没有足够的索引存在的情况下才会这样做,这一点在本例中很明显,因为计算结果表明不可能有索引。事实上,如果你能用额外的条件缩小范围,那就足够了。我喜欢这个词,它会根据词在词中的位置来排序!!很遗憾,SQL必须评估整个表才能对其进行排序,但这是可以理解的。如果我可以用WHERE条件缩小搜索范围,那么性能可能不会成为问题。只有在没有足够的索引存在的情况下才会这样做,这一点在本例中很明显,因为计算结果表明不可能有索引。事实上,如果你能用额外的条件缩小范围,那就足够了。