Это возвращает процент, равный 1 бит в обеих строках:
select bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10))/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;
Как вы храните ваши битовые поля поскольку представление базы 2 преобразуется в числа, нам сначала нужно сделать конверсии: conv(a.string, 2, 10)
, conv(b.string, 2, 10)
.
Тогда мы храним только биты, которые равны 1 в каждом поле: conv(a.string, 2, 10) & conv(b.string, 2, 10)
И мы считаем их: bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10))
И, наконец, мы просто вычислить процент: bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10))/6 * 100
.
Запрос возвращает 50
для 111000
и 111111
.
Вот другая версия, которая также рассчитывает совпадающие нули:
select bit_count((conv(a.string, 2, 10) & conv(b.string, 2, 10)) | ((0xFFFFFFFF>>(32-6))&~(conv(a.string, 2, 10)|conv(b.string, 2, 10))))/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;
Обратите внимание, что, в то время как это решение работает, вы действительно должны сохранить это поле, как это вместо:
INSERT INTO sim (sim_key, string)
VALUES (1, conv("111000", 2, 10));
INSERT INTO sim (sim_key, string)
VALUES (2, conv("111111", 2, 10));
Или для обновления существующих данных:
UPDATE sim SET string=conv(string, 10, 2);
Тогда этот запрос дает те же результаты (если вы обновляли данные, как описано выше):
select bit_count(a.string & b.string)/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;
И считать нули тоже:
select bit_count((a.string & b.string) | ((0xFFFFFFFF>>(32-6))&~(a.string|b.string)))/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;
(заменить 6
сек по размеру ваших битовых полей)
Не могли бы вы разместить некоторые данные образца в табличном формате и желаемом выходе? – Quassnoi
Не могли бы вы, пожалуйста, подробнее рассказать о проблеме? –
Вывести два числа в одной строке таблицы или они из одного столбца в двух разных строках? Я чувствую, что это возможно, «как» зависит от того, откуда эти цифры. Это потребует вычисления в MySQL, поэтому индексы не будут использоваться - это заставит его медленно запрашивать большой набор данных (возвращая множество строк), но ОК, если вы только сравниваете сразу два числа. – Purpletoucan