왼쪽 결합이 이중인 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
'source' 카테고리의 다른 글
Angular에서 앵커 해시 링크를 처리하는 방법JS (0) | 2022.12.13 |
---|---|
그렇다면 (성공, 실패)는 언제 약속의 반대가 되는가? (0) | 2022.12.13 |
Java Generics: 목록에 캐스트할 수 없는가? (0) | 2022.12.13 |
2개의 조인 및 구별로 그룹화된 mysql 쿼리 최적화 (0) | 2022.12.13 |
PHP는 T_PAAMAYIM_NEKUDOTAYIM을 기대합니까? (0) | 2022.12.13 |