0

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

例如

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

实现结果的最佳方法是什么?

4

1 回答 1

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)
于 2013-04-10T13:12:45.677 回答