поиск по полю varchar
Есть база данных 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 |