поиск по полю varchar

Рейтинг: 0Ответов: 1Опубликовано: 26.03.2023

Есть база данных MySql. Есть таблица Task. Есть varchar поле 'executors_id'. В нём через запятую перечисляются id исполнителей задачи. Могут быть записи типа '1' или '1,178,202' или '2,33' и т.д.

Каким запросом можно выбрать все задачи конкретного исполнителя, к примеру с id == 1 и не вытянуть лишнего, к примеру задачи исполнителя 178?

Ответы

▲ 1Принят

В качестве прямого ответа на вопрос предлагаю использовать регулярные выражения. '^1,|,1,|,1$|^1$' тут мы ищем 1 во всех случаях:

  • ^1, - в начале строки 1 и далее другие числа
  • ,1, - где-то в середине строки
  • ,1$ - последнее число в строке 1
  • ^1$ - единственное число и это 1

Schema (MySQL v5.7)

CREATE TABLE Tasks (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    Name VARCHAR (255) NOT NULL,
    Users VARCHAR (255)
);


INSERT INTO Tasks (Name, Users)
VALUES
    ("Footbal", '1'),
    ("Cooking", '178,1,202'),
    ("Shopping", '12,33');

Query #1

SELECT * from Tasks WHERE (SELECT Users  REGEXP '^1,|,1,|,1$|^1$')=1;
id Name Users
1 Footbal 1
2 Cooking 178,1,202

Вариант с изменением структуры БД

На счет Вашей версии MySQL не уверен, но я побыстрому накидал как бы я организовывал таблицы. Разумеется, имена таблиц - дело вкуса. Возможно упустил какие-то моменты, так как редко пишу SQL, но думаю основную суть смог передать — в журнале содержаться пары задача - пользователь и они могут быть любыми валидными парами, т.е. на одну задачу может быть несколько пользователей и наоборот, но каждая запись отвечает за одну связь. Надеюсь Вам это поможет.

Schema (MySQL v5.7)

CREATE TABLE Users (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    Name VARCHAR (255) NOT NULL
);

CREATE TABLE Tasks (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    Name VARCHAR (255) NOT NULL
);

CREATE TABLE Journal (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    TaskID INT,
    UserID INT,
    INDEX ts_ind (TaskID),
    INDEX us_ind (UserID),
    FOREIGN KEY (TaskID) REFERENCES Tasks(id),
    FOREIGN KEY (UserID) REFERENCES Users(id) 
);

INSERT INTO Users (Name)
VALUES
    ("Peter"),
    ("Masha");


INSERT INTO Tasks (Name)
VALUES
    ("Footbal"),
    ("Cooking"),
    ("Shopping");


INSERT INTO Journal (TaskID, UserID)
VALUES
    (1, 1),
    (2, 2),
    (3, 1);

Query #1

SELECT 
  Tasks.Name as task, 
  Users.Name as user 
FROM 
  Journal 
  LEFT JOIN Users ON Journal.UserID = Users.id 
  LEFT JOIN Tasks ON Journal.TaskID = Tasks.id 
WHERE 
  UserID = 1;
task user
Footbal Peter
Shopping Peter

View on DB Fiddle