我正在构建一个MySQL标记数据库,以允许用户标记产品。
我目前的设计使用这些表格:
Account
id (PK)
username
Product
id (PK)
product_name
Product_Tag
id (PK)
product_id (FK to Product)
tag_id (FK to Tag)
account_id (FK to Account)
created_date
Tag
id (PK)
tag_name
请注意,在我的设计中,我正在跟踪哪个用户标记了产品以及何时使用同一标签多次标记产品,因此我知道哪些标签最适合给定产品。
我正在尝试找出一个标记搜索查询,该查询返回最标记为搜索标记的产品。例如,如果我查询“红色礼服”,那么标记为“红色”和“礼服”的产品应该出现在结果集的顶部。使用我现有的设计可以实现哪些查询?
答案 0 :(得分:1)
select max(cnt) from(
select count(*) cnt
from product_tag
where tag_id = <tag id of red dress>
group by product_id);
答案 1 :(得分:1)
此问题最像是Relational Division
SELECT a.ID, a.ProductName
FROM Product a
INNER JOIN Product_Tag b
ON a.ID = b.Product_ID
INNER JOIN Tag c
ON b.Tag_ID = c.ID
WHERE a.ProductName IN ('RED','ADDRESS')
GROUP BY a.ID, a.ProductName
HAVING COUNT(*) >= 2
ORDER BY COUNT(*) DESC
答案 2 :(得分:0)
试试这个:
SELECT
P.id,
P.product_name
FROM Product P
LEFT JOIN Product_tag PT
ON P.id = PT.product_id
LEFT JOIN Tag T
On PT.tag_id = T.id
WHERE T.tag_name = 'red'
OR T.tag_name = 'dress'
GROUP BY P.id, P.product_name
ORDER BY COUNT(P.id) DESC
您无法使用LIMIT
来获取标记最多的n
个产品。