Php 按常用标记计数查找相似项目和订单
我搜索了类似的问题,但解决方案针对不同的情况,具有不同的表格结构:( 我需要获得具有类似标记的design_id的列表,按最常见标记的条目排序 表结构:Php 按常用标记计数查找相似项目和订单,php,mysql,sql,inner-join,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 desig
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,我们将寻找具有“红色、蓝色、黑色、灰色”标签的设计,这将按此顺序给出以下结果:
设计4、设计5
(当然不包括原始输入设计)
最后,我不需要返回设计ID,而是需要从具有匹配设计的table shop_tshirts中找到相应的article_ID。这样做的最佳方法是什么?我应该执行单独的查询还是另一个内部联接?重新说明我们必须处理的内容,以便解决方案更加明显:
+-----------+ +-----------------+ +--------------+
| 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