是否有有效的算法来确定项目配置文件并使用查询选择匹配的配置文件?
例如
TABLE MEN
id name
1 man1
2 man2
3 man3
TABLE PROPERTIES
id name
1 health_points
2 strenght
3 speed
TABLE MEN_PROPERTIES
id man_id property_id property_counter
1 1 1 1000
2 1 2 100
3 1 3 50
4 2 1 100
5 2 2 200
6 2 3 100
7 3 1 100
8 3 2 10
9 3 3 5
这意味着
man1 {
health_point:1000,
strenght:100
speed:50
}
man2 {
health_point:100,
strenght:200
speed:100
}
man3 {
health_point:100,
strenght:10
speed:5
}
假设我正在处理man_1,我们直观地了解其配置文件与man_3配置文件匹配。我希望mysql将man_3作为与man_1配置文件匹配的配置文件返回。
获得结果的最佳方法是什么?
答案 0 :(得分:1)
SELECT x.*
FROM
(
SELECT a.ID,
a.Name,
MAX(IF(c.Name = 'health_points', b.property_counter, NULL)) health_points,
MAX(IF(c.Name = 'strenght', b.property_counter, NULL)) strenght,
MAX(IF(c.Name = 'speed', b.property_counter, NULL)) speed
FROM Men a
INNER JOIN Men_Properties b
ON a.ID = b.man_ID
INNER JOIN Properties c
ON b.Property_ID = c.ID
WHERE a.ID <> 1
GROUP BY a.ID, a.Name
) x
CROSS JOIN
(
SELECT a.ID,
a.Name,
MAX(IF(c.Name = 'health_points', b.property_counter, NULL)) health_points,
MAX(IF(c.Name = 'strenght', b.property_counter, NULL)) strenght,
MAX(IF(c.Name = 'speed', b.property_counter, NULL)) speed
FROM Men a
INNER JOIN Men_Properties b
ON a.ID = b.man_ID
INNER JOIN Properties c
ON b.Property_ID = c.ID
WHERE a.ID = 1
GROUP BY a.ID, a.Name
) y
WHERE (x.health_points * 1.0 / y.health_points) = (x.strenght * 1.0 / y.strenght) AND
(x.strenght * 1.0 / y.strenght) = (x.speed * 1.0 / y.speed)