1

我正在构建一个 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

请注意,在我的设计中,我正在跟踪哪个用户在何时标记了产品,并允许使用同一个标签多次标记产品,这样我就知道哪些标签对于给定产品最受欢迎。

我试图找出一个标签搜索查询,该查询返回被搜索标签标记最多的产品。例如,如果我查询“红色连衣裙”,则带有“红色”和“连衣裙”标签的产品应该出现在结果集中的顶部。什么查询可以用我现有的设计完成这个?

4

3 回答 3

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
于 2013-02-02T01:45:23.677 回答
1
select max(cnt) from(
    select count(*) cnt
    from product_tag
    where tag_id = <tag id of red dress>
    group by product_id);
于 2013-02-01T23:04:24.777 回答
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

您无法使用LIMITto 获得第一个n标记最多的产品。

于 2013-02-01T23:08:49.417 回答