Mysql совпадение между двумя значениями в виде списка - PullRequest
1 голос
/ 28 февраля 2012

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

SELECT * FROM records1
WHERE records1.set IN (SELECT records2.p
FROM `records2`
WHERE rcords2.id=1200 )

Я проверяю только этот запрос:

SELECT (records2.p)
FROM `records2`
WHERE rcords2.id=1200

Это дает результаты

p
========
14, 12, 80

И есть такие записи records1.set

set
=============
80, 20, 60

И почему это не соответствует?

1 Ответ

0 голосов
/ 28 февраля 2012

Количество различных установленных значений конечно.Так что это должно работать:

SELECT * FROM records1, records2
WHERE (rcords2.id=1200) and (
    ((FIND_IN_SET('12', records1.set) > 0) and (FIND_IN_SET('12', records2.p) > 0)) or
    ((FIND_IN_SET('14', records1.set) > 0) and (FIND_IN_SET('14', records2.p) > 0)) or
    ((FIND_IN_SET('60', records1.set) > 0) and (FIND_IN_SET('60', records2.p) > 0)) or
    ((FIND_IN_SET('80', records1.set) > 0) and (FIND_IN_SET('80', records2.p) > 0)) or
    ...
)

А также возможны двоичные операции, если наборы обеих таблиц определены одинаково (в одинаковом порядке):

select * from records1, records2
where (rcords2.id=1200) and (records1.set & records1.set);

Это работаеттолько если оба столбца имеют тип набора ('12 ',' 14 ',' 60 ',' 80 ', ...)

Если это список, разделенный запятыми, в строковом поле, то sql-оператор может выглядеть следующим образом:

SELECT * FROM records1, records2
WHERE (records2.id=1200) and (
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 1), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 2), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 3), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 4), ',', -1), ",%")) or
...
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', N), ',', -1), ",%"))
)

Если строковое поле имеет тип varchar (X), то в этом поле меньше, чем X / 2 возможных значений, поэтому замените N на X / 2 в моем SQL-выражении.

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