【发布时间】:2020-05-10 19:11:49
【问题描述】:
我这里有这段代码
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);
问题在于,它应该为每个目录从 Department 中获取前 10 个元素并随机选择其中的 3 个,然后向 CatalogDepartment 添加 3 行,每行包含目录 ID 和分类 ID。但它会随机选择 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 个部门
【问题讨论】:
-
你的MySql是什么版本的?
-
版本为8.0.17
-
由于表没有顺序,“第一”是什么意思? Order by 在 limit/top 之前完成,但没有 order by 的 limit/top 返回 DBMS 选择的任何值。阅读您正在使用的功能的手册。 PS 在代码问题中给出minimal reproducible example。并找到第一个返回您不期望的子表达式。很高兴您告诉我们您的期望是什么。
-
已经被下面的@forpas 解决了
标签: mysql sql join random sql-order-by