source

왼쪽 결합이 이중인 MySQL Update 행, 첫 번째 일치 제한

manysource 2022. 12. 13. 20:10

왼쪽 결합이 이중인 MySQL Update 행, 첫 번째 일치 제한

테이블이 3개 있다(SQLFiddle과 테이블 작성)

여기에 이미지 설명 입력

오렌지색 텍스트는 Products.name과 Filters를 비교하여 얻을 수 있는 것입니다.필터링을 실시합니다.

서브스트링 매칭은 다음과 같이 할 수 있습니다.

on Products.name LIKE CONCAT('%',Filters.filter,'%');

첫 번째 필터 매치만 사용하면 됩니다.그래서 '머쉬룸 수프'는 '머쉬룸'이 아니라 '수프'랑 어울릴 것 같아요

이 작업에 가장 적합한 접근법은 무엇입니까?

가능하다면 테스트 완료 SQLFiddle 링크를 부탁합니다.

시도 내용 : (아래는 모두 생략 가능)

더블 조인 시도:

update Products
left join Filters on Products.name LIKE CONCAT('%',Filters.filter,'%')
join Categories on Filters.category_name = Categories.name
set Products.category_id = Categories.id, Products.filter = Filters.filter;

그러나 첫 번째 조인은 모든 필터 조회를 반환하고(1개 제품당 여러 줄) 이후 두 번째 조인의 카테고리는 마지막 조회에서 반환되었기 때문에 첫 번째 조회가 사용되는 은 아닙니다.

예를 들어 다음과 같습니다.버섯 수프는 '수프'가 아닌 '머쉬룸-재료' 필터로 분류되었습니다.

가입+주문도 해봤습니다.

select Products.name, Filters.* 
from Products
left join Filters on Products.name LIKE CONCAT('%',Filters.filter,'%')
group by Products.name;

이렇게 하면 필요에 따라 제품별로 첫 번째 일치가 반환되지만 동일한 쿼리에서 두 번째 왼쪽 조인을 수행할 수 없습니다.또한 "select"가 아닌 "update" 함수 이후에 "group by"를 작동시킬 수 없습니다.

Sqlfiddle이 무너지는 경우:

CREATE TABLE Products
(
    `name` varchar(30), 
    `category_name` varchar (30), 
    `category_id` int
);

INSERT INTO Products (`name`)
VALUES ('Mushrooms'), ('Can of mushrooms'),
       ('Can of soup'), ('Mushroom soup'),
       ('Tomato soup'), ('Tomato');

CREATE TABLE Filters
(
     `filter` varchar(30), 
     `category_name` varchar(30)
);

INSERT INTO Filters (`filter`, `category_name`)
VALUES ('Can of', 'Canned food'), ('Soup', 'Meals'),
       ('Mushroom', 'Ingredients'), ('Tomato', 'Ingredients');

CREATE TABLE Categories
(
     `id` int, 
     `name` varchar(30)
);

INSERT INTO Categories (`id`, `name`)
VALUES (1, "Canned food"), (2, 'Ingredients'), (3, 'Meals');

Select 쿼리로 문제를 해결하려는 시도뿐만 아니라 sqlfiddle로 작업을 매우 쉽게 만들었습니다.

원하는 방식으로 작동하며, 범주 테이블에 왼쪽 조인만 추가하면 됩니다(IDK가 제대로 작동하기 때문에 범주에 가입할 수 없었던 이유).

선택하신 쿼리를 다음과 같이 편집했습니다.

select Products.name, Filters.*,Categories.id from Products
left join Filters
on Products.name LIKE CONCAT('%',Filters.filter,'%')
left join Categories
on Categories.name = Filters.category_name
GROUP BY Products.name;

이 쿼리에서 원하는 결과를 얻을 수 있습니다.

이제 업데이트하려면Products이 쿼리 결과가 포함된 테이블은 다음 작업을 수행할 수 있습니다.

update Products
left join Filters
on Products.name LIKE CONCAT('%',Filters.filter,'%')
left join Categories
on Categories.name = Filters.category_name
set Products.category_name = Filters.category_name, 
    Products.category_id = Categories.id;

작업 데모를 보려면 여기를 클릭하십시오.

도움이 됐으면 좋겠다!

언급URL : https://stackoverflow.com/questions/47142215/mysql-update-rows-with-double-left-join-limiting-first-match