#mysql #sql #where
#mysql #sql #where-предложение
Вопрос:
У меня есть следующий SQL-запрос, в котором результаты возвращаются, если введено имя или фамилия бойца. Мне нужно добавить к этому SQL-запросу, чтобы возвращать результаты, если также введены имя и фамилия. Вот запрос:
SELECT distinct
'${searchT}' searchalp,
(SELECT COUNT(fighterId) FROM tblFighter where fighter_lastName like '${searchT}%' or fighter_firstName like '${searchT}%' ) totalresults,
A.FighterID,
A.Fighter_FirstName,
A.Fighter_NickName,
if (A.Fighter_Height > 0,
CONCAT(FLOOR(A.Fighter_Height/12), '' ', MOD(A.Fighter_Height,12), '"'), '') Fighter_Height_inch,
A.Fighter_NormalWeight,
if (A.Fighter_Reach > 0, CONCAT(ROUND(A.Fighter_Reach,0), '"') , '') Fighter_Reach,
A.Fighter_Stance,
CONCAT('/fighter/',REPLACE(REPLACE(LCASE(A.Fighter_FirstName),' ','-'),'.',''),'/',REPLACE(LCASE(A.Fighter_LastName),' ','-'),'/',A.FighterID,'/') fighterURL,
(select count(*) from tblFight_Fighter where FighterID = A.FighterID and OutcomeID = 1) fighterCareerWins, (select count(*) from tblFight_Fighter where FighterID = A.FighterID and OutcomeID = 2) fighterCareerLosses, (select count(*) from tblFight_Fighter where FighterID = A.FighterID and OutcomeID = 3) fighterCareerDraws,
fighter_lastName, FA.AccoladeDescription FROM tblFighter as A LEFT JOIN (SELECT FighterId, AccoladeDescription, AccoladeType
FROM tblAccolade
JOIN tblEvent USING(EventID)
JOIN (SELECT AccoladeID, Max(Event_Date) as MaxAccDate
FROM tblAccolade
JOIN tblEvent ON tblAccolade.EventID = tblEvent.EventID
WHERE AccoladeType = 'Belt' AND AccoladeDescription not like 'WEC%'
GROUP BY AccoladeID) as tmpMaxAccDate ON tblAccolade.AccoladeID = tmpMaxAccDate.AccoladeID
WHERE Event_Date = MaxAccDate) as FA ON FA.FighterId = A.FighterId and FA.AccoladeType = 'Belt' where A.fighter_lastName like '${searchT}%' or A.fighter_firstName like '${searchT}%' order by A.fighter_lastName ASC LIMIT ${stInd}, ${lstInd}
Вот пример того, что возвращается, когда в поле ввода вводится фамилия:
<table class="wide">
<thead>
<tr>
<th>FIRST</th>
<th>LAST</th>
<th>NICKNAME</th>
<th>Ht.</th>
<th>Wt.</th>
<th>Reach</th>
<th>Stnc.</th>
<th>W</th>
<th>L</th>
<th>D</th>
<th>Belt</th>
</tr>
</thead>
<tbody><tr>
<td><a href="/fighter/scott/smith/376/">Scott</a></td>
<td><a href="/fighter/scott/smith/376/">Smith</a></td>
<td><a href="/fighter/scott/smith/376/">Hands of Steel</a></td>
<td>6' 0"</td>
<td>185 lbs</td>
<td>70"</td>
<td>Orthodox</td>
<td>4</td>
<td>6</td>
<td>0</td>
<td style="width:100px;"></td>
</tr><tr>
<td><a href="/fighter/dillon/smith/1406/">Dillon</a></td>
<td><a href="/fighter/dillon/smith/1406/">Smith</a></td>
<td><a href="/fighter/dillon/smith/1406/"></a></td>
<td>6' 0"</td>
<td>170 lbs</td>
<td></td>
<td></td>
<td>1</td>
<td>0</td>
<td>0</td>
<td style="width:100px;"></td>
</tr><tr>
<td><a href="/fighter/maurice/smith/19/">Maurice</a></td>
<td><a href="/fighter/maurice/smith/19/">Smith</a></td>
<td><a href="/fighter/maurice/smith/19/"></a></td>
<td>6' 2"</td>
<td>221 lbs</td>
<td></td>
<td>Orthodox</td>
<td>6</td>
<td>3</td>
<td>0</td>
<td style="width:100px;"></td>
</tr><tr>
<td><a href="/fighter/david/smith/1236/">David</a></td>
<td><a href="/fighter/david/smith/1236/">Smith</a></td>
<td><a href="/fighter/david/smith/1236/"></a></td>
<td></td>
<td>155 lbs</td>
<td></td>
<td></td>
<td>2</td>
<td>1</td>
<td>0</td>
<td style="width:100px;"></td>
</tr><tr>
<td><a href="/fighter/eric/smith/1027/">Eric</a></td>
<td><a href="/fighter/eric/smith/1027/">Smith</a></td>
<td><a href="/fighter/eric/smith/1027/"></a></td>
<td></td>
<td>0 lbs</td>
<td></td>
<td>Southpaw</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td style="width:100px;"></td>
</tr><tr>
<td><a href="/fighter/patrick/smith/48/">Patrick</a></td>
<td><a href="/fighter/patrick/smith/48/">Smith</a></td>
<td><a href="/fighter/patrick/smith/48/"></a></td>
<td>6' 2"</td>
<td>225 lbs</td>
<td></td>
<td>Orthodox</td>
<td>4</td>
<td>2</td>
<td>0</td>
<td style="width:100px;"></td>
</tr><tr>
<td><a href="/fighter/adam/smith/1269/">Adam</a></td>
<td><a href="/fighter/adam/smith/1269/">Smith</a></td>
<td><a href="/fighter/adam/smith/1269/"></a></td>
<td></td>
<td>0 lbs</td>
<td></td>
<td></td>
<td>0</td>
<td>1</td>
<td>0</td>
<td style="width:100px;"></td>
</tr><tr>
<td><a href="/fighter/josh/smith/1121/">Josh</a></td>
<td><a href="/fighter/josh/smith/1121/">Smith</a></td>
<td><a href="/fighter/josh/smith/1121/"></a></td>
<td>6' 0"</td>
<td>155 lbs</td>
<td></td>
<td>Orthodox</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td style="width:100px;"></td>
</tr></tbody>
</table>
Комментарии:
1. Что это за тип базы данных?
2. @octopusgrabbus тип «плохо спроектированный». В этом запросе полный бардак.
3. -1 За вставку полной путаницы в запросе и просто комментарий «Это не работает» в ответах.
4. В вашем запросе слишком много бизнес-логики…
5. Я думаю, что я выразился ясно. Я хочу каким-то образом добавить к этому запросу, что если пользователь вводит имя и фамилию, запрос вернет результаты. Я просто хочу добавить это к этому запросу. Что здесь такого сложного для понимания?
Ответ №1:
В последней строке просто измените:
где A.fighter_lastName типа ‘${SEARCHCHT}%’ или A.fighter_firstName типа ‘${searchcht}%’
использовать AND вместо OR
Ответ №2:
Измените третью строку выше, чтобы в ней было И:
(SELECT COUNT(fighterId) FROM tblFighter where fighter_lastName like '${searchT}%' AND fighter_firstName like '${searchT}%' ) totalresults,
Это должно решить вашу проблему.
Редактировать: Если вы хотите изменить свой запрос, чтобы он принимал два имени в одном поле «John Doe» (таким образом, вы будете искать имя John и фамилию Doe), вам нужно будет разделить строку на пробел и выполнить другое предложение WHERE. Вы могли бы попытаться добавить некоторую логику в существующее предложение WHERE или вы могли бы вызвать другой запрос. Однако, как было указано, вы используете слишком много бизнес-логики внутри вашего SQL-оператора. Попробуйте перенести эту обработку на бизнес-уровень вашего кода. Например, одно имя, состоящее из двух имен, которые вы описываете, может быть определено гораздо проще в вашем коде. Затем вы могли бы соответствующим образом изменить вызов.
Комментарии:
1. @Mojaray2k — вы рассматривали возможность описания, каким образом предложение не работает? Изменило ли это результаты, которые вы получаете? Если да, то каким образом это улучшило результаты, а каким образом нанесло ущерб? Вы единственный, кто может запускать эти запросы, поэтому простое указание «это не работает» никому не поможет исправить свои ответы. В качестве альтернативы, опубликуйте определения таблиц, образцы данных, текущие результаты и ожидаемые результаты, чтобы другие могли запускать свои запросы и тестировать их, прежде чем публиковать их в качестве ответов.
2. Подождите. Все, что я только что спросил, это. Как я могу сделать так, чтобы пользователь хотел возвращать результаты запроса, если введены имя и фамилия. Прямо сейчас результаты запроса возвращаются, если есть имя или фамилия. Почему это так сбивает с толку?
3. @Mojaray2k — ну, на данный момент кажется, что 5-6 человек сбиты с толку, и никто другой не предоставил ответа, поэтому я бы посоветовал вам добавить больше к вашему вопросу — некоторые примеры того, что вы получаете в данный момент, и что вам нужно вместо этого?
4. @Mojaray2k — Я обновил свой пост, чтобы отразить то, что, как я полагаю, вы говорите. Можете ли вы просмотреть его и сообщить мне, что вы думаете?
5. Нет, это не решает проблему. Текущий оператор WHERE работает нормально. Мне нужно добавить к нему, чтобы, когда пользователь вводит значение, подобное John Smith, оно возвращало то же значение, что и при вводе John или Smith, как сейчас настроена инструкция sql. Я ценю вашу помощь.