Для этого в MySQL необходимо написать хранимую процедуру; вам нужно будет изменить имя базы данных test
на имя фактического имени вашей базы данных. Было бы намного проще сделать это с PHP - но где это весело?
DELIMITER //
CREATE PROCEDURE test.check_subcats(
IN s_delimiter VARCHAR(30)
)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE s_csv TEXT;
DECLARE i_subcat_index INT(10) unsigned DEFAULT 1;
DECLARE i_subcat_count INT(10) unsigned;
DECLARE l_category_done INT(10) DEFAULT FALSE;
DECLARE c_category CURSOR FOR SELECT category.sub_cat FROM category;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_category_done = TRUE;
-- create a temporary table to hold every csv value
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_csv(cvalue VARCHAR(10) NOT NULL);
OPEN c_category;
l_category: LOOP
FETCH c_category INTO s_csv;
IF l_category_done THEN
LEAVE l_category;
ELSE
-- determine the number of sub-categories
SELECT (LENGTH(s_csv) - LENGTH(REPLACE(s_csv, s_delimiter, ''))) + 1 INTO i_subcat_count;
-- loop to store all csv values
WHILE i_subcat_index <= i_subcat_count DO
INSERT INTO tmp_csv (cvalue) (
SELECT REPLACE(SUBSTRING(
SUBSTRING_INDEX(s_csv, s_delimiter, i_subcat_index),
LENGTH(SUBSTRING_INDEX(s_csv, s_delimiter, i_subcat_index - 1)) + 1
), s_delimiter, '')
);
SET i_subcat_index = i_subcat_index + 1;
END WHILE;
END IF;
SET i_subcat_index = 1;
END LOOP;
CLOSE c_category;
SELECT DISTINCT tmp_csv.cvalue FROM tmp_csv WHERE tmp_csv.cvalue NOT IN (SELECT category.id FROM category);
DROP TEMPORARY TABLE IF EXISTS tmp_csv;
END //
DELIMITER ;
Я не 100% уверен в том, как надежный это, но она работает с данными о моем Dev поле.
Вы указать разделитель для данных CSV при вызове процедуры таким образом:
CALL `check_subcats`(',');
По существу, это петли через category
таблицы для чтения sub_cat
. Затем он разбивает значение sub_cat
на куски, используя предоставленный разделитель (подобно функции PHP explode()
) и записывает каждое из этих значений во временную таблицу.
Это дает временную таблицу, в которой хранятся все ваши данные CSV в отдельных битах, и это просто вопрос выбора из этих данных NOT IN
списка category.id
.
не могли бы вы уточнить ?? –
Я не думаю, что любой может понять ваш вопрос. Не могли бы вы прояснить? – BenM
Да, (sub_cat) значения, разделенные запятыми, являются идентификаторами одной и той же таблицы, мне нужно получить значения, которые не находятся в столбце id. Подобно 2,3,7, присутствуют в столбце id, тогда как 20,24 - нет. Мне нужно получить только 20,24. Любая помощь или подсказка будут оценены. –