我搜索了类似的问题,但解决方案适用于具有不同表格结构的不同情况:(
我需要获取带有类似标签的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。做这个的最好方式是什么?我应该进行单独的查询还是其他内部联接?
答案 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