通过常用标签查找类似的项目和订单

时间:2017-12-04 03:18:58

标签: php mysql sql inner-join

我搜索了类似的问题,但解决方案适用于具有不同表格结构的不同情况:(

我需要获取带有类似标签的design_id列表,按照最常见标签计数的条目排序

表格结构:

shop_tags (tag_id, tag_name)
shop_tags_link (tag_id, design)
shop_tshirts (design_id, article_id)

假设我有4个设计

design_id 1 tags = red, blue
design_id 2 tags = black, grey
design_id 3 tags = yellow, green
design_id 4 tags = white, red, black
design_id 5 tags = red

输入是一系列设计ID:

$input = array("1", "2");

我需要找到具有相似标签的设计并按公共标签计数(desc)对它们进行排序,因此如果输入是设计1和2,我们正在寻找带有“红色,蓝色,黑色,灰色”标签的设计。将按此顺序给出以下结果:

design 4, design 5(当然不包括原始输入设计)

最后,我不需要返回设计ID,而是需要从具有匹配设计的table shop_tshirts中找到相应的article_id。做这个的最好方式是什么?我应该进行单独的查询还是其他内部联接?

1 个答案:

答案 0 :(得分:1)

重申我们必须使用的内容,以便解决方案更加明显:

+-----------+    +-----------------+    +--------------+
| shop_tags |    | shop_tags_links |    | shop_tshirts |
+-----------+    +-----------------+    +--------------+
| tag_id    |----| tag_id          |  /-| design_id    |
| tag_name  |    | design_id       |-/  | article_id   |
+-----------+    +-----------------+    +--------------+

design_id 1 tags = red, blue
design_id 2 tags = black, grey
design_id 3 tags = yellow, green
design_id 4 tags = white, red, black
design_id 5 tags = red

+-----------+   +-----------------+   +--------------+
| shop_tags |   | shop_tags_links |   | shop_tshirts |
+-----------+   +-----------------+   +--------------+
| 1 red     |   |   1  1          |   | 1  ?         |
| 2 blue    |   |   2  1          |   | 2  ?         |
| 3 black   |   |   3  2          |   | 3  ?         |
| 4 grey    |   |   4  2          |   | 4  ?         |
| 5 yellow  |   |   5  3          |   | 5  ?         |
| 6 green   |   |   6  3          |    
| 7 white   |   |   7  4          |   
|           |   |   1  4          |   
                |   3  4          |   
                |   1  5          |   
  

"找到具有相似标签的设计,并按公共标签计数(desc)"对它们进行排序,   因此,如果输入是设计1和2,我们正在寻找带有标签的设计"红色,蓝色,黑色,灰色"这将按此顺序给出以下结果:

     

设计4,设计5(当然不包括原始输入设计)"

这应该让你指向正确的方向。这是我的头脑和未经测试,所以它可能需要一些调整,但它应涵盖主要概念。

select count(b.tag_id) as mysort, b.design_id, c.article_id
from shop_tags_links as a, shop_tags_links as b inner join shop_tshirts as c on b.design_id=c.design_id
where 
    a.design_id IN (?,?) AND
    a.tag_id=b.tag_id AND
    b.design_id NOT IN(?,?) 
group by b.design_id
order by mysort desc