Warm tip: This article is reproduced from serverfault.com, please click

mariadb-MySQL:分类法

(mariadb - MySQL: Taxonomy)

发布于 2020-11-30 16:46:41

我希望有人可以帮助我提出我要做什么的查询。我有一个列出游戏服务器的网站,我正在尝试改善搜索系统。

有三张桌子。服务器,version_taxonomy和category_taxonomy。分类表包含两列,一列用于服务器ID,一列用于版本/类别ID,可以在其中建立服务器与其支持的版本和类别之间的关联。

到现在为止,我一直将两个分类表与服务器表连接在一起,并正在为一种版本和一种类别查找服务器,但一切正常。但是,我希望允许同时搜索具有多个类别的服务器

我制作了一张图像,想说明我要做什么: 分类表

假设我正在寻找同时具有类别5和12的服务器-基于左侧的表将是服务器1和3。但是在查询中该如何处理?以及我将如何使用该查询来稍后获取并使用服务器的其余数据(像往常一样进行JOIN操作?)

希望这是有道理的!期待你的答复。

Questioner
Stelios Mac
Viewed
0
xQbert 2020-12-01 01:02:08

假设我了解这个问题:

连接两个表,然后计算类别ID的不同值,同时限制它们。如果可以保证表A中serverID,categoryID的唯一性以及与服务器分类法的1:1关系是唯一的,那么只要你始终限制为1且仅限制1个版本,就不需要区分。

SELECT A.ServerID, count(A.CategoryID) CatCnt
FROM A
INNER JOIN B
  on A.ServerID = B.ServerID
WHERE A.CATEGORYID in (5,12)
  and B.Version= 1.16
GROUP BY A.ServerID
HAVING count(distinct A.CategoryID) = 2

类别ID可以是传入的参数,也可以是计数值,因为你知道这两个值。

它可以用作CTE或用作源的内联派生表,然后加入以获得附加数据。或假设其为1:1关系,则加入所需的数据。

如果你想要一个可行的示例:将DDL用于表和SQL发布以创建示例数据,然后将某些内容放在https://rextester.com/中