2012-03-30 2 views
1

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

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

$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 обеспокоен - как я уверен, что мой код демонстрирует :)

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

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

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

Все благодарности за помощь и помощь были получены с благодарностью.

Tony.

ответ

1

Это можно сделать с помощью 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

Спасибо за это @milan. Он работает - конечно, лучше, чем код, который я придумал, но, похоже, он не достигает максимального значения, если сравнение находится между числом и нулевым значением (например, $ field1 = 4000, $ field2 = NULL). Будет ли это ожидаться? Любые идеи, как преодолеть это? В очередной раз благодарим за помощь. – tcarnell

+1

Несомненно, используйте COALESCE. Вместо field1 и field2 используйте COALESCE (поле1,0) и COALESCE (поле2,0) –

+1

Superb @milan. Это великолепно работало :) Большое спасибо за вашу помощь, очень ценю. – tcarnell

0

Ой, ой, я забыла 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 документ на string to int conversion

+0

Это не сработает, потому что он выполняет max() во время запроса в столбцах VARCHAR. Значения, которые он получает для '$ row1 ['max_id_1']' AND '$ row2 ['max_id_2']', вероятно, недействительны. Вы, в лучшем случае, предоставляете максимум два числа, которые в любом случае не являются максимальными числами в db, и поэтому не решают проблему. – cegfault

+0

Да, я видел это как 30 секунд до вашего комментария :) Спасибо в любом случае – haltabush

-1

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

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

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

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

Смежные вопросы