Mysql分析项目并选择匹配的配置文件

时间:2013-04-10 12:39:07

标签: mysql select profiling match

是否有有效的算法来确定项目配置文件并使用查询选择匹配的配置文件?

例如

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配置文件匹配的配置文件返回。

获得结果的最佳方法是什么?

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)