Найти максимальное числовое значение двух полей varchar - PullRequest
1 голос
/ 31 марта 2012

Я пытаюсь найти максимальное значение, содержащееся в двух отдельных полях моей таблицы.

Код, который я использую в моей модели:

$query = $this->db->query("select max($field1) as max_id_1 from default_table1");
$row1 = $query->row_array();
$query = $this->db->query("select max($field2) as max_id_2 from default_table1");
$row2 = $query->row_array();
return max($row1['max_id_1'], $row2['max_id_2']);

Я полный новичок в том, что касается PHP и CodeIgniter - так как я уверен, что мой код демонстрирует:)

Он работает, поскольку возвращает значения, но не максимальные значения, которые у меня есть в полях. Например, я знаю, что есть значение 4000, но самое высокое возвращаемое значение равно 750.

Мне интересно, если это потому, что поля имеют тип VARCHAR, потому что, хотя они в основном содержат числа, есть некоторые, которые содержат символы (- или &) или слово 'to', поэтому я не мог использовать тип INT. Из-за использования VARCHAR он не видит, что 4000 больше 750?

Если это так, есть ли способ преобразовать содержимое поля в целочисленное значение перед проверкой максимального значения, и на это будут влиять нецелые значения в полях?

Все предложения помощи и совета принимаются с благодарностью.

Tony.

Ответы [ 3 ]

1 голос
/ 31 марта 2012

Это можно сделать с помощью SQL с использованием неявного преобразования типов MySQL:

select max(case when (field1+0)>(field2+0) then field1+0 else field2+0 end)
from default_table1

Использование +0 приведет к преобразованию varchar в число, а также к игнорированию любых символов, следующих за номером.Если вам все еще нужен оригинальный контент, вы можете написать запрос следующим образом:

select case when (field1+0)>(field2+0) then field1 else field2 end
from default_table1
order by case when (field1+0)>(field2+0) then field1+0 else field2+0 end desc
limit 1
0 голосов
/ 31 марта 2012

То, что вы действительно запрашиваете, - это способ для codeigniter преобразовать строки в числа и найти их максимальные значения.Я не знаю ни одного способа сделать это в codeigniter.

Если вы действительно этого хотите, у вас есть два варианта:

  1. перебрать все строки в таблице ииспользуйте php для разбора числа, ища максимальное число
  2. Добавьте числовой столбец в базу данных и выполняйте анализ строки в число в этом новом столбце всякий раз, когда вставляются значения.

Первый вариант невероятно неэффективен, а второй, вероятно, является вашей лучшей ставкой.

0 голосов
/ 31 марта 2012

Ой, я забыл часть MySQL Вы должны сделать то же самое, приведя к целому числу:

select max(cast($field1 to unsigned)) as max_id_1 from default_table1

Это зависит от ваших данных, но вы можете попробовать что-то подобное

return max((int)$row1['max_id_1'], (int)$row2['max_id_2']);

Взгляните на документ PHP по преобразование строки в int

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...