MySQL запрос, чтобы перечислить AZ для нескольких столбцов - PullRequest
0 голосов
/ 18 сентября 2019

У меня есть база данных с компаниями в ней, и каждая компания имеет различные имена контактов в своих собственных столбцах с именем

nameone nametwo namethree namefive namesix

Мне нужно искать все имена по ихпервая буква, затем вытащите данные, если первая буква совпадает.например, выберите nameone, ГДЕ nameone == "B".

Затем мне нужно заказать это по ASC. Например, выберите nameone, ГДЕ nameone == "B", ЗАКАЗАТЬ ПО ASC.

например, вывод для T будетбыть Таня Трейси Тревор Том

Проблема в том, что это может быть комбинация нескольких имен, которые совпадают.Например, выберите nameone, ГДЕ nameone == "B" ИЛИ ГДЕ nametwo == "B".и поэтому мне нужно иметь возможность заказать их через выход AZ (надеюсь, что это имеет смысл!)

например, для вывода T будет Tanya от nameone Tracey от nameone Trevor от nametwo Tom от namethree

Я использую 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)

Однако, похоже, это не работает.Заказывает по имени.Так, если, например, я ищу «T», он будет упорядочен по имени, а затем, если имя «T» (скажем, tyrone) будет найдено в nametwo, оно помещается в верхнюю часть списка, а не в нижнюю.

Для вывода данных я использую нижеприведенное в цикле 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», а имя с именем Tanya было в столбце «nameone», то

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, затем Az их?

например,

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');
...