A table is in first normal form (1NF) when each column holds one atomic value, no group of columns repeats (author1, author2), and a key identifies every row. The authors cell fails: finding Omar Haddad's books takes LIKE '%Haddad%', which cannot use an index and would match "Haddadi" too. Give each value its own row; JSON_TABLE (JSON_TABLE) splits all lists at once:
CREATE TABLE sku_authors (PRIMARY KEY (sku, author)) AS
SELECT DISTINCT s.sku, TRIM(j.author) AS author
FROM sheet AS s, JSON_TABLE(CONCAT('["', REPLACE(s.authors, ',', '","'), '"]'),
'$[*]' COLUMNS (author VARCHAR(40) PATH '$')) AS j;
ALTER TABLE sheet DROP COLUMN authors;
SELECT author, GROUP_CONCAT(sku ORDER BY sku) AS skus
FROM sku_authors GROUP BY author HAVING COUNT(*) > 1;Output
+-------------+---------------------+ | author | skus | +-------------+---------------------+ | Omar Haddad | BK-LAR-01,BK-PHP-01 | | Rui Costa | BK-SQL-01,BK-SQL-02 | +-------------+---------------------+
Authors with several books are now a plain GROUP BY, and a join maps these rows onto product_authors (ER Model to Tables). Keep a list as JSON only when you never join, count or constrain its elements, as with products.attributes.