FIND_IN_SET и ошибка усеченного неверного значения DOUBLE - PullRequest
0 голосов
/ 13 октября 2019

это часть моего запроса:

select * from tb_test where IF(_Tags,
             TAD.id IN (
                 SELECT T2.taggable_id as id FROM Tb_Taggables T2
                 WHERE T2.taggable_type = 'archives'
                 AND
                FIND_IN_SET(T2.tag_id,_Tags)
             )
        ,TRUE)

_Tags имеет следующее значение: '377,379'.

моя Tb_Taggables таблица:

CREATE TABLE Tb_Taggables (
    id            bigint UNSIGNED AUTO_INCREMENT
        PRIMARY KEY,
    tag_id        bigint UNSIGNED NOT NULL,
    taggable_id   bigint UNSIGNED NOT NULL,
    taggable_type varchar(191)    NOT NULL,
    created_at    timestamp       NULL,
    updated_at    timestamp       NULL
)
    COLLATE = utf8mb4_unicode_ci;

, но я получил это сообщение об ошибке:

[22007][1292] (conn=29800) Truncated incorrect DOUBLE value: '377,379'

1 Ответ

1 голос
/ 13 октября 2019

Зачем вообще использовать условное выражение?

where (_Tags is null or
       TAD.id IN (SELECT T2.taggable_id as id
                  FROM Tb_Taggables T2
                  WHERE T2.taggable_type = 'archives' AND
                        FIND_IN_SET(T2.tag_id, _Tags)
                 )
      )

В общем случае условная логика в предложении where (case или if()) просто усложняет выражения.

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

  • Числа должны храниться с использованием правильного типа, который не является строкой.
  • Идентификаторы, которые соединяют таблицы, должныправильно объявили отношения внешнего ключа, что вы не можете сделать.
  • Базы данных вообще имеют плохую функциональность обработки строк.
  • Базы данных имеют отличную структуру данных для хранения списков. Она называется таблица , а не строка .
  • Вывод нескольких значений в строку исключает использование индексов и разделов в этом столбце, что влияет на масштабируемость и производительность.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...