Как сравнить строки одной и той же таблицы и применить вес из другой таблицы к каждому столбцу - PullRequest
2 голосов
/ 26 июня 2019

Я пытаюсь создать в MySQL своего рода базу данных, соответствующую «личностям».

  • Мне нужно сравнить конкретного человека в таблице «Члены» со всеми остальными в той же таблице.

  • Каждая строка (человек) в таблице содержит несколько столбцов с информацией (возраст, местоположение, религия и т. Д.).

  • Мне нужен запрос для ссылки на таблицу, которая содержит мои «веса» для каждого столбца.Другими словами, я хочу сказать, что «местоположение важно в 75, возрастной диапазон очень важен в 100, а религия не важна в 10».

Таблица членов

+----+-------+----------+----------+-----+----------+
| ID | Name  | Location | Religion | Age | AgeRange |
+----+-------+----------+----------+-----+----------+
| 1  | Joe   | LA       | Athiest  | 40  | 30-40    |
+----+-------+----------+----------+-----+----------+
| 2  | Mary  | LA       | Agnostic | 35  | 35-45    |
+----+-------+----------+----------+-----+----------+
| 3  | Karen | NYC      | Athiest  | 45  | 30-35    |
+----+-------+----------+----------+-----+----------+
| 4  | Lisa  | LA       | Hindu    | 30  | 45-55    |
+----+-------+----------+----------+-----+----------+

Таблица весов (насколько важен параметр)

+----+-----+----------+----------+
| ID | Age | Location | Religion |
+----+-----+----------+----------+
| 1  | 100 | 75       | 10       |
+----+-----+----------+----------+

За последние 2 дня я пробовал много вещей, но последний запрос, с которым я пытался поиграть, был следующим:не очень полезный.Также не указывается «лицо», с которым будут сравниваться эти записи.

SELECT  a.first_name,
        g.name, 
        a.age* g.age+
        a.location* g.location+
        a.religion * g.mwReligion AS metric
    FROM members a, weight g  
    ORDER BY metric DESC;

Мой предполагаемый вывод будет выглядеть так:

Joe Matches:

Мэри - Оценка = 285
(100, потому что она в его AgeRange + 100, потому что он в ее AgeRange + 75 для Места + 10 для религии)

Лиза - Оценка = 175 (100, потому что она в егоAgeRange + 75 для местоположения)

Карен - Оценка = 10 (Только религия соответствует)

*** ОГРОМНОЕ СПАСИБО ИМПЕЛЯРУ И ЛИПКОЙ БИТ ЗА ИХ ПОМОЩЬ НА ЭТОМ !!!

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Я бы предположил, что столбцы min_age и max_age являются отдельными (вместо AgeRange), включительно и типом данных INT. Запрос, который вам нужен, должен выглядеть так:

select 
  x.id,
  x.name,
  x.ma as match_age,
  x.ml as match_location,
  x.mr as match_religion,
  x.ma * w.age + x.ml * w.location + x.mr * w.religion as total_score
from (
  select
    o.id,
    o.name,
    case when o.age between p.min_age and p.max_age then 1 else 0 end as ma,
    case when o.location = p.location then 1 else 0 end as ml,
    case when o.religion = p.religion then 1 else 0 end as mr
  from (select * from members where id = 1) p -- selects Joe
  cross join (select * from members where id <> 1) o -- select other members
) x
cross join weights w
1 голос
/ 26 июня 2019

В MySQL логическое выражение становится 0 или 1 в числовом контексте. Таким образом, вы можете использовать свои сравнения как фактор.

Так что присоединяйтесь к членам с идентификатором одного, который ниже, чем другие (в противном случае, то есть, когда вы просто проверяли неравенство, в результате вы получали каждую пару дважды). Затем скрестите весы.

Теперь вы можете построить свою метрику как сумму умножений сравнений и весов.

Я предполагаю, что религия и сравнение сравниваются по равенству. Возраст одного человека сравнивается с возрастным диапазоном другого человека и наоборот. Более того, я беру возрастной диапазон как разделенный на нижнюю и верхнюю границы и предполагаю, что границы диапазона включительно. Тогда это может выглядеть следующим образом:

SELECT m1.name,
       m2.name,
       (m1.age BETWEEN m2.agerangelower
                       AND m2.agerangeupper) * w1.age
       +
       (m2.age BETWEEN m1.agerangelower
                       AND m1.agerangeupper) * w1.age
       +
       (m1.location = m2.location) * w1.location
       +
       (m1.religion = m2.religion) * w1.religion metric
       FROM members m1
            INNER JOIN members m2
                       ON m1.id < m2.id
            CROSS JOIN weights w1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...