У меня есть база данных с компаниями в ней, и каждая компания имеет различные имена контактов в своих собственных столбцах с именем
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
Таким образом, это вывело бы
- Том
- Тони
- Тревор
- Трой
#
ОБНОВЛЕНИЕ 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');