Поиск похожих записей на основе таблицы соединителей с отношениями «многие ко многим» - PullRequest
0 голосов
/ 05 января 2012

у меня 3 таблицы Products,ProductHas,Props. Само собой разумеется, что каждый продукт имеет более одной опоры, которая хранится в таблице ProductHas. Я пытаюсь найти Product B, который ближе всего к Product A промежуткам сходства их реквизита.

Текущая структура таблиц выглядит следующим образом.

+----------+----------+-----------+
|Products  |ProductHas|Props      |
+----------+----------+-----------+
|product_id|product_id|prop_id    |
+----------+----------+-----------+
|   name   | prop_id  |description|
+----------+----------+-----------+

Ответы [ 4 ]

0 голосов
/ 05 января 2012

Вы можете попробовать индекс fulltext в таблице реквизитов, i

CREATE TABLE Props(
   prop_id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
   description TEXT,
   FULLTEXT (description)
 ) ENGINE=MyISAM;

(я ничего не знаю о размере описания, но если вы знаете егоограничение, то вы должны поставить его как description VARCHAR(200))

SELECT * 
 FROM Props prod_a_props, 
   Props prod_b_props, 
   ProductHas prod_a_rel
 WHERE prod_a_rel.product_id = :your_product_A_id
   AND prod_a_props.prop_id = prod_a_rel.prop_id
   AND MATCH (prod_b_props.description) AGAINST (prod_a_props.description);
0 голосов
/ 05 января 2012

Другой вариант

SELECT  A.Name, B.Name, COUNT(*)
FROM    (
          SELECT  p.name, pp.description
          FROM    Products p
                  INNER JOIN ProductHas ph ON ph.product_id = p.product_id
                  INNER JOIN Props pp ON pp.prop_id = ph.prop_id
        ) AS A INNER JOIN (
          SELECT  p.name, pp.description
          FROM    Products p
                  INNER JOIN ProductHas ph ON ph.product_id = p.product_id
                  INNER JOIN Props pp ON pp.prop_id = ph.prop_id
        ) AS B ON B.description = A.Description
WHERE   A.Name = 'A'        
GROUP BY
        A.name, B.Name
ORDER BY
        COUNT(*) DESC
0 голосов
/ 05 января 2012

Попробуйте:

select h1.product_id, count(h0.prop_id) count_matches, count(*) total_props
from ProductHas h1
left join ProductHas h0 
on h0.product_id = ? and h0.prop_id = h1.prop_id and h0.product_id <> h1.product_id
group by h1.product_id
order by 2 desc
limit 1
0 голосов
/ 05 января 2012

Попробуйте что-то вроде этого:

SELECT  B.product_id
FROM    Products B
        INNER JOIN
                ProductHas HB
                INNER JOIN
                        ProductHas HA
                        INNER JOIN
                                Products A
                                ON HA.product_id = A.product_id
                        ON HA.prop_id = HB.prop_id
                        AND HA.product_id != HB.product_id
                ON B.product_id = HB.product_id
WHERE   A.product_id = xxx
GROUP BY B.product_id
ORDER BY COUNT(A.product_id) DESC
LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...