#php #sql #sql-server #for-loop #while-loop
#php #sql #sql-сервер #for-цикл #цикл while
Вопрос:
У меня есть 2 таблицы, которые мне нужно запросить для получения одного результата, но если он найден в $ table0, мне нужно прекратить поиск и использовать значения в этой строке. Что-то вроде этого:
$p1_sql = "SELECT TOP 1 * FROM '$table0' WHERE phone1 = '$cidnumber'";
$p2_sql = "SELECT TOP 1 * FROM '$table0' WHERE phone2 = '$cidnumber'";
$c1_sql = "SELECT TOP 1 * FROM '$table1' WHERE contactphone = '$cidnumber'";
$c2_sql = "SELECT TOP 1 * FROM '$table1' WHERE contactphone2 = '$cidnumber'";
$c3_sql = "SELECT TOP 1 * FROM '$table1' WHERE contactphone3 = '$cidnumber'";
$c4_sql = "SELECT TOP 1 * FROM '$table1' WHERE contactphone4 = '$cidnumber'";
$p1_res = mssql_query($p1_sql);
$p1_row = mssql_num_rows($p1_res);
$p2_res = mssql_query($p2_sql);
$p2_row = mssql_num_rows($p2_row);
$c1_res = mssql_query($c1_sql);
$c1_row = mssql_num_rows($c1_res);
$c2_res = mssql_query($c2_sql);
$c2_row = mssql_num_rows($c2_res);
$c3_res = mssql_query($c3_sql);
$c3_row = mssql_num_rows($c3_res);
$c4_res = mssql_query($c4_sql);
$c4_row = mssql_num_rows($c4_res);
if ($p1_row = 1){
$p1_res = $newres;
goto okres;
} elseif ($p2_row = 1) {
$p2_res = $newres;
goto okres;
} elseif ($c1_row = 1) {
$c1_res = $newres;
goto okres;
} elseif ($c2_row = 1) {
$c2_res = $newres;
goto okres;
} elseif ($c3_row = 1) {
$c3_res = $newres;
goto okres;
} elseif ($c4_row = 1) {
$c4_res = $newres;
goto okres;
} else {
$newres = "na";
goto nares;
}
okres:
$cid_sel = mssql_query("SELECT TOP 1 * FROM '$table0' WHERE phone1 = '$cidnumber'");
Это, однако, некрасиво и не работает. Я пытался использовать ‘для каждого …’ или ‘пока (что-то)’, но не мог понять, как это будет работать. Я даже не знаю, будет ли это. Каков наилучший способ сделать это? Это мой первый опыт в чем-то подобном, и любая помощь приветствуется.
Ответ №1:
Нет необходимости выполнять так много отдельных запросов. Знакомы ли вы с базовым SQL в том, что касается объединений? Если нет, вам следует прочитать о них — то, что вы хотите здесь, кажется достижимым с помощью одного запроса.
Комментарии:
1. Я думал о том, чтобы объединить ВСЕ, но разве тогда это не был бы просто один большой запрос? Что я получаю? Я думаю, что я действительно хочу сделать, это запустить каждую из них за раз и проверить, произошел ли результат, и если да, то остановить. Поставить IF между каждой? Могу ли я запустить оператор IF внутри запроса?
2.Или
SELECT
CASE WHEN phone1 = $cidnumber THEN ??? ELSE
CASE WHEN phone2 = $cidnumber THEN ??? ELSE
...
сработало бы что-то подобное?3. @lorsungcu — На самом деле вы не можете поместить оператор IF в запрос (ну, вы можете, но не для того, чтобы делать то, что вы хотите сделать здесь). Если запрос ОБЪЕДИНЕНИЯ у вас не работает, возможно, было бы лучше написать хранимую процедуру, в которой вы действительно могли бы иметь тип IF … ЗАТЕМ логика, которую вы хотите.
4. То, что вы получаете от одного запроса, — это более простой / качественный код, включающий один результат для обработки вместо многих. Многие запросы также имеют проблему, заключающуюся в том, что один из них может завершиться ошибкой на этом пути..
Ответ №2:
Я бы добавил разные запросы в массив и зациклил (используя foreach) этот массив для последующего запроса к базе данных. Как только вы найдете то, что ищете, вы выходите из цикла, используя команду break; .
Использование объединений в чистом sql также может быть решением, но я не совсем уверен, чего вы хотите здесь достичь.
Удачи!
Комментарии:
1. Вроде того. В любом случае, я думаю, что это привело меня в правильном направлении. Спасибо!