Случайные элементы внутри JOIN - PullRequest
0 голосов
/ 24 января 2020

У меня есть этот код здесь

INSERT INTO Directory.CatalogTaxonomy (`CatalogId`, `TaxonomyId`, `TaxonomyTypeId`, `IsApprovalRelevant`)
SELECT cat.CatalogId, dep.Id, @department_type, false
FROM Directory.Catalog cat
    JOIN (SELECT * FROM (
        SELECT * FROM Taxonomy.Department LIMIT 10
    ) as dep_tmp ORDER BY RAND() LIMIT 3) 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);

И проблема в том, что он должен для каждого каталога взять первые 10 элементов из Отдела и случайным образом выбрать 3 из них, а затем добавить в CatalogDepartment 3 строки, каждый содержащий идентификатор каталога и идентификатор таксономии. Но вместо этого он случайным образом выбирает 3 элемента Department и затем добавляет эти 3 элемента в каждый каталог.

Текущий результат выглядит следующим образом:

1   000de9d7-af8b-4bac-bdbd-e6e361e5bc5e
1   001d4060-2924-4c75-b304-d780454f261b
1   001bc4b8-c1bc-498d-9aee-3825a40587d5
2   000de9d7-af8b-4bac-bdbd-e6e361e5bc5e
2   001d4060-2924-4c75-b304-d780454f261b
2   001bc4b8-c1bc-498d-9aee-3825a40587d5
3   000de9d7-af8b-4bac-bdbd-e6e361e5bc5e
3   001d4060-2924-4c75-b304-d780454f261b
3   001bc4b8-c1bc-498d-9aee-3825a40587d5

Как видите, есть только 3 отдела выбран и повторен для каждого каталога

1 Ответ

1 голос
/ 24 января 2020

Если вы считаете, что запрос:

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 элементов из Отдела , поскольку таблица не упорядочена.

...