【问题标题】:Find similar items and order by common tags count查找相似商品并按常见标签计数排序
【发布时间】:2017-12-04 03:18:58
【问题描述】:

我搜索了类似的问题,但解决方案是针对不同表结构的不同情况:(

我需要获取带有相似标签的 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(当然不包括原始输入设计)

最后,我需要从表 shop_tshirts 中找到对应的 article_id 与匹配的设计,而不是返回设计 ID。做这个的最好方式是什么?我应该做一个单独的查询还是另一个 INNER JOIN?

【问题讨论】:

    标签: php mysql sql inner-join


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 2011-03-21
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多