Генетика! или убийственный SQL запрос

Главные вкладки

Аватар пользователя gumk gumk 23 мая 2010 в 20:15

вот такая задача стоит:
есть база данных
__________________________________
uid | a1 | a2 | b1 | b2 | c1 | c2
----------------------------------

как можно сделать sql запрос, чтобы:
поиск по пользователю имеющего характеристики A1, A2, B1, B2, C1, C2
необходимо сравнить:
A1 c a1, a2
A2 c a1, a2
B1 c b1, b2
B2 c b1, b2
C1 c c1, c2
C2 c c1, c2

затем сортировать результат начиная с наименьшего количества совпадений.
Возможно ли такое реализовать? Если возможно то как?

Комментарии

Аватар пользователя gumk gumk 24 мая 2010 в 0:52

я так понимаю нужно написать что то вроде

SELECT uid,
 ((CASE a1 WHEN %d THEN 1 )
 + (CASE a2 WHEN %d THEN 1 )
 + (CASE b1 WHEN %d THEN 1 )
 + (CASE b2 WHEN %d THEN 1 )
 + (CASE c1 WHEN %d THEN 1 )
 + (CASE c2 WHEN %d THEN 1 )) AS COUNT
FROM {gen}  ORDER BY COUNT DESC

вот так пытался что-то не работатет

Аватар пользователя sergeir sergeir 24 мая 2010 в 11:01

Попробуйте следующий запрос. Может поможет

SELECT uid AS COUNT
FROM {gen} g
LEFT JOIN {gen} g1 ON g1.uid = g.uid
LEFT JOIN {gen} g2 ON g2.uid = g.uid
LEFT JOIN {gen} g3 ON g3.uid = g.uid
LEFT JOIN {gen} g4 ON g4.uid = g.uid
LEFT JOIN {gen} g5 ON g5.uid = g.uid
LEFT JOIN {gen} g6 ON g6.uid = g.uid
WHERE (g1.a1 IN(A1,A2)) OR (g2.a2 IN(A1,A2))
OR (g3.b1 IN(B1,B2)) OR (g4.b2 IN(B1,B2))
OR (g5.c1 IN(C1,C2)) OR (g6.c2 IN(C1,C2))
GROUP BY uid
ORDER BY  COUNT DESC