Как мне добавить дополнительное условие к предложению WHERE в SQL-запросе?

#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. Я ценю вашу помощь.