2013-04-10 7 views
0

Есть ли эффективный алгоритм для определения профилей элементов и выбора соответствующих вопросов с запросом?Mysql профилирование элементов и выбор совпадающих профилей

, например

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.

Каков наилучший способ достижения результата?

+2

почему man_3 совпадает с man_1? –

+0

хорошо, он сбалансирован как man_1, но имеет более низкие значения, я ищу соответствие пропорций – Mike

+0

да, если man3 {health_point: 100, strenght: 20, speed: 5} и man4 {health_point: 100, strenght: 10, speed: 5 } они оба совпадают, но man_4 является ближайшим – Mike

ответ

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) 
+0

Хорошо, теперь мне нужно его разобраться! я буду bac, как только возможно :) – Mike

+0

Что делает запрос, он статически поворачивает таблицы в подзапросе и фильтрует определенный идентификатор. Результатом подзапроса является перекрестная ссылка на все записи. –

Смежные вопросы