abler98
@abler98
Software Engineer

Как оптимизировать данный код?

Я думаю, что это не есть хорошо выполнять два почти одинаковых запроса, но почему-то сократить до одного у меня не получилось.
public function findRegion(array $pos) {
		list($x, $y, $z) = $pos;
		
		$result = $this->database->query('
			SELECT COUNT(*) FROM `regions` WHERE 
			' . $x . ' >= LEAST(`Ax`, `Bx`) AND ' . $x . ' <= GREATEST(`Ax`, `Bx`) AND 
			' . $y . ' >= LEAST(`Ay`, `By`) AND ' . $y . ' <= GREATEST(`Ay`, `By`) AND 
			' . $z . ' >= LEAST(`Az`, `Bz`) AND ' . $z . ' <= GREATEST(`Az`, `Bz`)
		');
		
		if ($result->num_rows > 0) {
			return $this->database->query('
				SELECT * FROM `regions` WHERE 
				' . $x . ' >= LEAST(`Ax`, `Bx`) AND ' . $x . ' <= GREATEST(`Ax`, `Bx`) AND 
				' . $y . ' >= LEAST(`Ay`, `By`) AND ' . $y . ' <= GREATEST(`Ay`, `By`) AND 
				' . $z . ' >= LEAST(`Az`, `Bz`) AND ' . $z . ' <= GREATEST(`Az`, `Bz`)
			')->fetch_assoc();
		} else {
			return false;
		}
	}


В общем, я сделал так:
public function findRegion(array $pos) {
		list($x, $y, $z) = $pos;
		
		$result = $this->database->query('
			SELECT * FROM `regions` WHERE 
			' . $x . ' >= LEAST(`Ax`, `Bx`) AND ' . $x . ' <= GREATEST(`Ax`, `Bx`) AND 
			' . $y . ' >= LEAST(`Ay`, `By`) AND ' . $y . ' <= GREATEST(`Ay`, `By`) AND 
			' . $z . ' >= LEAST(`Az`, `Bz`) AND ' . $z . ' <= GREATEST(`Az`, `Bz`)
		');
		
		if ($result->num_rows > 0) {
			return $result->fetch_assoc();
		} else {
			return false;
		}
	}

Но так я получаю ошибку, если нет совпадений
  • Вопрос задан
  • 2224 просмотра
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Не очень понятно какую ошибку Вы получаете если нет совпадений.
Ваша функция должна просто возвращать false насколько понятно из кода.

PSДелать отдельный запрос select count имеет смысл только в том случае, когда вам например нужно получить количество результатов не получая самих результатов.
Ответ написан
Комментировать
Второй вариант должен работать, нужно смотреть ошибку (подозреваю она в php)

P.S. В первом варианте есть подозрительное место, возможно, что $result->num_rows будет всегда 1 возвращать для COUNT(*) запроса, в зависимости от библиотеки.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Тут действительно можно выкинуть кучу бесмысленного кода.
$sql = "SELECT ...";
return $this->database->query($sql)->fetch_assoc();

- это ВЕСЬ код, который нужен.

При отсутствии совпадений ни этот код, ни код приведенный в запросе, никакой ошибки выдавать не будет. Автору померещилось.

А проблема, скорее, не в совпадениях, а в отсутствии исходных данных и неумении корректно добавляь данные в запрос.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы