Если вы считаете, что запрос:
SELECT * FROM (
SELECT * FROM Taxonomy.Department LIMIT 10
) as dep_tmp
ORDER BY RAND() LIMIT 3
, который вы присоединяете к Directory.Catalog
, возвращает 3 разных отдела для каждого каталога, то вы ошибаетесь. Этот запрос выполняется только один раз и возвращает 3 случайных отдела, которые объединяются (всегда те же 3) в Directory.Catalog
. Что вы можете сделать, так это после того, как вы СОЕДИНИТЕ 10 отделов на Directory.Catalog
, выберите случайным образом 3 из них для каждого каталога. Попробуйте это:
INSERT INTO Directory.CatalogTaxonomy (`CatalogId`, `TaxonomyId`, `TaxonomyTypeId`, `IsApprovalRelevant`)
WITH cte AS (
SELECT cat.CatalogId, dep.Id AS TaxonomyId, @department_type AS TaxonomyTypeId, false AS IsApprovalRelevant
FROM Directory.Catalog AS cat
CROSS JOIN (SELECT * FROM Taxonomy.Department LIMIT 10) AS dep
WHERE cat.CatalogId NOT IN (SELECT CatalogId FROM Directory.CatalogTaxonomy WHERE TaxonomyTypeId = department_type)
AND cat.UrlStatus = @url_status_green
AND (cat.StatusId = @status_published OR cat.StatusId = @status_review_required);
)
SELECT t.CatalogId, t.TaxonomyId, t.TaxonomyTypeId, t.IsApprovalRelevant
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY CatalogId ORDER BY RAND()) rn
FROM cte
) t
WHERE t.rn <= 3
Обратите внимание, что это:
SELECT * FROM Taxonomy.Department LIMIT 10
не гарантирует получение первых 10 элементов из Отдела , поскольку таблица не упорядочена.