2015-02-26 3 views
1

Comma separated values not in id columnфильтр разделенные запятой значения из той же таблицы

Может кто-нибудь помочь мне получить значения sub_cat (CSV), которые не находятся в столбце идентификаторов из той же таблицы.

(sub_cat) значения, разделенные запятыми, являются идентификаторами одной и той же таблицы, мне нужно получить значения, которые не находятся в столбце id. Подобно 2,3,7, присутствуют в столбце id, тогда как 20,24 - нет. Мне нужно получить только 20,24.

+0

не могли бы вы уточнить ?? –

+0

Я не думаю, что любой может понять ваш вопрос. Не могли бы вы прояснить? – BenM

+0

Да, (sub_cat) значения, разделенные запятыми, являются идентификаторами одной и той же таблицы, мне нужно получить значения, которые не находятся в столбце id. Подобно 2,3,7, присутствуют в столбце id, тогда как 20,24 - нет. Мне нужно получить только 20,24. Любая помощь или подсказка будут оценены. –

ответ

2

Как я уже писал в сообщении this, я не рекомендую хранить данные в формате CSV. Это дает проблемы с доступом и обновлением.

Я не уверен в этом, но вы могли бы просто использовать:

SELECT sub_cat FROM table_name WHERE id NOT IN (
    SELECT sub_cat FROM table_name 
) 

Однако, я всегда предпочитаю хранить только один идентификатор для каждой строки.

+0

Нет, у этого будут другие идентификаторы из таблицы. –

+0

Спасибо @tiGer, я отредактировал запрос. – Matthijs

+0

Он не будет работать, поскольку столбец имеет разделенные запятыми значения. –

0

Для этого в 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.

+0

Это было слишком сложно для меня сделать во время обеденного перерыва на работе - отсюда и отсрочка ответа, мне пришлось подождать, пока я не вернусь домой;) – CD001

+0

Я еще не использовал хранимые процедуры, но я буду попробуйте. Новые вещи всегда интересны. –

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