我有一个包含公司的数据库,每个公司在各自的列中都有各种联系人姓名

名字一个名字两个名字三个名字四个名字五个名字ix

我需要按其首字母搜索所有名称,然后在首字母匹配的情况下提取数据。 例如,选择nameone WHERE nameone ==“ B”。

然后,我需要通过ASC进行排序,例如选择nameone WHERE nameone ==“ B” ORDER BY ASC。

例如T的输出为Tanya Tracey Trevor Tom

问题在于它可能是多个匹配的名称的组合。 例如,选择nameone WHERE nameone ==“ B”或WHERE nametwo ==“ B”。 因此,我需要能够通过AZ在输出中订购它们(希望如此!)

例如,对于T的输出将是来自nameone的Tanya来自namethree的Tracey来自namethree的nametwo的

我正在使用Mysqli,我认为使用CASE可能会实现。 以下是我的查询。

// added ."%" so value becomes e.g. A% (to allow the LIKE clause and search for first letter only 
e.g. show all nameone or nametwo begining with A)
$value = $letter . "%";
// prepare query + bind values. 
$stmt = $mysqli -> prepare('SELECT id, displayname, nameone, nametwo, namethree, namefour, namefive, 
namesix FROM companies WHERE nameone LIKE ? OR nametwo LIKE ? OR namethree LIKE ? OR namefour LIKE ? OR 
namefive LIKE ? OR namesix LIKE ? ORDER BY (CASE WHEN nameone LIKE ? THEN nameone END) ASC, (CASE 
WHEN nametwo LIKE ? THEN nametwo END) ASC, (CASE WHEN namethree LIKE ? THEN namethree END) ASC, 
(CASE WHEN namefour LIKE ? THEN namefour END) ASC, (CASE WHEN namefive LIKE ? THEN namefive END) 
ASC, (CASE WHEN namesix LIKE ? THEN namesix END) ASC');

                        if (
                        $stmt &&
                        $stmt -> bind_param('ssssssssssss', $value, $value, $value, $value, $value, 
$value, $value, $value, $value, $value, $value, $value) &&
                        $stmt -> execute() &&
                        $stmt -> store_result() &&
                        $stmt -> bind_result($id, $displayname, $nameone, $nametwo, $namethree, 
$namefour, $namefive, $namesix)

但是,这似乎不起作用。 它按nameone订购。 因此,例如,如果我搜索“ T”,它将按nameone排序,然后如果在nametwo中找到了“ T”名称(例如tyrone),它将放在列表的顶部而不是底部。

为了输出数据,我在while循环中使用以下内容

<?php if (strtoupper($nameone[0]) == strtoupper($letter)) {
echo htmlspecialchars($nameone)."<br>";
} ?>
<?php if (strtoupper($nametwo[0]) == strtoupper($letter)) {
echo htmlspecialchars($nametwo)."<br>";
} ?>                                        
<?php if (strtoupper($namethree[0]) == strtoupper($letter)) {
echo htmlspecialchars($namethree)."<br>";
} ?>    
<?php if (strtoupper($namefour[0]) == strtoupper($letter)) {
echo htmlspecialchars($namefour)."<br>";
} ?> 
<?php if (strtoupper($namefive[0]) == strtoupper($letter)) {
echo htmlspecialchars($namefive)."<br>";
} ?>                                         
<?php if (strtoupper($namesix[0]) == strtoupper($letter)) {
echo htmlspecialchars($namesix)."<br>";
} ?> 

有任何想法我做错了吗?

更新

刚意识到,如果我搜索例如“ T”,并且在“ nameone”列中有一个名为Tanya的名称,

 CASE WHEN nameone LIKE ? THEN nameone END 

将是一个命中,反过来将停止查询(正确?)。 如果是这样,我如何将查询中nameone,nametwo,namethree等的名称列表合并到AZ中?

更新2

尝试使其更加清晰。 我有一张像这样的桌子:

 --------------------------------------------------------------------- | nameone | nametwo | namethree | companyname | --------------------------------------------------------------------- | Troy | Alice | jane | SRS LTD | --------------------------------------------------------------------- | Simon | james | Trevor | LRP LTD | --------------------------------------------------------------------- | Spike | Tony | jon | Jones LTD | --------------------------------------------------------------------- | Luke | Chris | tom | LRP LTD | --------------------------------------------------------------------- 

我怎么说?给我所有以T开头的名字,然后再给他们?

例如

 SELECT companyname, nameone, nametwo, namethree FROM companies WHERE any names 1st letter begings with T ORDER BY ASC 

所以它会输出

  1. 汤姆
  2. 托尼
  3. 特雷弗
  4. 特洛伊

更新3

这似乎可行(仍在测试中)

 SELECT ID, displayname, nameone, nametwo, namethree, namefour, namefive, namesix FROM kelham WHERE nameone LIKE ? OR nametwo LIKE ? OR namethree LIKE ? OR namefour LIKE ? OR namefive LIKE ? OR namesix LIKE ? ORDER BY CASE WHEN nameone LIKE ? THEN nameone WHEN nametwo LIKE ? THEN nametwo WHEN namethree LIKE ? THEN namethree WHEN namefour LIKE ? THEN namefour WHEN namefive LIKE ? THEN namefive WHEN namesix LIKE ? THEN namesix END ASC'); 

  ask by user6796243 translate from so

本文未有回复,本站智能推荐:

1回复

MySQL-按情况排序不起作用

我有一个具有两列(id,full_name)的表'users',我用PHP创建了一个搜索框,此后我搜索了如何根据相关性对其进行排序,我找到了解决方案,但它无法正常工作,所以如果有三行包含John史密斯(Smith)的全名,那么它给我的唯一结果就是桌子 这是我的代码 所以我的问题是,当我搜
1回复

如何在MySQL查询的where子句中传递数组值?

我有一个变量$element其值为: 我想在查询中使用此变量: 实际上,我想从$ element变量的每个元素中进行解析,并分别呈现不同的输出。
2回复

我如何将某些文本输入字母与mysql数据库进行比较

我试图找到一种方法来比较我的文本输入的某些字母与MYSQL表上的一列。 这是我的代码: 我想是对前两个三个字母从我的变量比较$ccode到phonecode从表country 。 我尝试像使用普通文本一样使用$ccode% ,但是没有用。 数据库字段电话代码包含国际电话代码,变量$
1回复

确实有多重或克劳斯减慢查询速度

我有一个函数可以把这个字符串 进入这个where子句 在进行搜索的表中,一条记录将具有一个类似于以下内容的tags字段 因此,当上述where子句运行时,它可以搜索tags字段,并且tags的顺序对搜索没有影响 为什么我包围在每一个标签的原因[]做一个LIKE cluse它包括的
1回复

在PHP-MYSQL中使用`fetch_assoc()`在预准备语句中使用`SELECT*`打印多个`WHERE`子句的结果的正确方法是什么?

我的查询如下: 我想用fetch_assoc打印结果集,这是因为我不想将bind_result()改为所有23列的名字,我想用$row['column_name']打印它,实现它的正确方法是什么? 如果你想查看我的代码,我在这里问另一个问题: 如何在PHP-MYSQL中的预准备语句中使用
2回复

MySQL问题与RAND()和1个DESC?

我已经使用数据库创建了一个画廊。 所有图像随机显示在主页上。 现在,我需要在导航栏中添加一个新的“最新” index.php/latest.php类别。 我正在使用无限滚动和一些技巧来随机订购$rand=date("i"); 。 问题: ORDER BY 1 DESC在index.
2回复

选择相同的列值以字符串开头,2个问题的行

我正在尝试获取多个行总和,每个总和具有匹配的列字符串值,并且所有值都具有匹配的4个字符前缀,但是它不起作用,我可以使用一些帮助。 另外,CASE会成为数据库上或多或少昂贵的查询吗? 从此开始: 从WHERE子句中的同一列获取结果是否有效? 实际上,col1具有行值,例如aaaa_st
1回复

MySQL查询小于和ORDERBYDESC

我正在处理大量数据,并试图从四个不同数据的每种组合中创建一个查询。 所有这些组合在一起形成了惊人的122,000,000行。 然后,我试图找到小于一定数量的权重,并按从最高到最低的另一个值进行排序。 我可以使用weight < x没问题。 我可以用weight < x o