2016-06-28 3 views
0

У меня есть таблица «table_film» и столбец «film_cat» как изображение нижеУдалить все записи, кроме некоторого id?

film_cat

Я хочу, чтобы удалить весь идентификатор в film_cat За исключением идентификатора 4,9,114,131 (они не включают в себя 4 числа в том же время, возможно, 4,9, -, 4,114, -, 4,9,131, ...)

Я пробовал, но не работал!

DELETE FROM `table_film` WHERE id NOT IN (SELECT * FROM table_film WHERE film_cat = '4' or film_cat='9' or film_cat='114' or film_cat='131') 

DELETE FROM table_film where film_cat NOT IN (4,9,114,131) 

DELETE FROM table_film WHERE film_cat != '4,9,114,131' 
+0

Что такое тип данных film_cat –

+0

Рассмотрите нормализацию таблицы, добавив другое отношение, подобное 'table_film_categories', с отношением« много-к-одному »(многие« фильмы »в любую данную категорию). – mbaitoff

ответ

0

Попробуйте это;)

DELETE FROM table_film WHERE film_cat NOT REGEXP '4|9|114|131' 

DELETE FROM table_film WHERE film_cat NOT REGEXP '[[:<:]]4[[:>:]]|[[:<:]]9[[:>:]]|[[:<:]]114[[:>:]]|[[:<:]]131[[:>:]]' 

Или используйте FIND_IN_SET:

DELETE FROM table_film 
WHERE FIND_IN_SET('4', film_cat) = 0 
AND FIND_IN_SET('9', film_cat) = 0 
AND FIND_IN_SET('114', film_cat) = 0 
AND FIND_IN_SET('131', film_cat) = 0 
+0

Большое вам спасибо, работал! –

3

Вот что происходит, когда у вас есть на самом деле, на самом деле плохое представление данных. Вы должны использовать таблицу соединений, film_categories с одной строкой на фильм и для каждой категории.

Хранение нескольких идентификаторов в одном столбце - плохая идея. Почему это плохо?

  • Хранение нескольких значений в одном столбце является плохим.
  • Хранение чисел как строк плохо.
  • Неотложные отношения с внешними ключами являются плохими.
  • MySQL имеет плохие функции манипулирования строкой.

Итак, вы должны исправить модель данных.

Теперь, иногда мы застряли в очень плохих дизайнерских дьяволах других людей. Вот один метод, который вы можете использовать в этом случае:

DELETE FROM table_film 
    WHERE find_in_set(4, film_cat) > 0 AND 
      find_in_set(9, film_cat) > 0 AND 
      find_in_set(114, film_cat) > 0 AND 
      find_in_set(131, film_cat) > 0 ; 

Примечание: AND s, возможно, должны быть OR s. Вопрос неясен в отношении точной логики.

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