MySQL&;PHP标记
我正在创建一个网络应用程序。我想支持标签。如何设置MySQL表?我想将链接与各种标记关联起来。您可以执行以下操作:MySQL&;PHP标记,php,mysql,tags,Php,Mysql,Tags,我正在创建一个网络应用程序。我想支持标签。如何设置MySQL表?我想将链接与各种标记关联起来。您可以执行以下操作: CREATE TABLE tags ( linkid int(10), tag varchar(20), primary key(linkid,tag) ); 因此,您将拥有(linkid,tag)的元组。以下格式允许每个链接有多个标记,并允许链接共享相同的标记。这使您可以轻松查看哪些链接受欢迎,同时避免存储重复的标记 模式 Links LinkID Url Name
CREATE TABLE tags (
linkid int(10),
tag varchar(20),
primary key(linkid,tag)
);
因此,您将拥有(linkid,tag)的元组。以下格式允许每个链接有多个标记,并允许链接共享相同的标记。这使您可以轻松查看哪些链接受欢迎,同时避免存储重复的标记 模式
Links
LinkID
Url
Name
Tags
TagID
Name
LinkTags
LinkID
TagID
样本数据:
Links
---------------------------------------------------
LinkID URL Name
1 http://avira.com/ Avira Antivirus
2 http://microsoft.com/ Microsoft
---------------------------------------------------
Tags
---------------------------------------------------
TagID Name
---------------------------------------------------
1 Software
2 Antivirus
3 Operating Systems
---------------------------------------------------
LinkTags
---------------------------------------------------
LinkID TagID
---------------------------------------------------
1 1
1 2
2 1
2 3
查询
链接和标签:
SELECT Links.*, GROUP_CONCAT(Tags.Name) AS TagList
FROM Links
LEFT JOIN LinkTags
ON LinkTags.LinkID = Links.LinkID
LEFT JOIN Tags
ON Tags.TagID = LinkTags.TagID
GROUP BY Links.LinkID
十个最流行的标签:
SELECT Tags.*
FROM LinkTags
LEFT JOIN Tags
ON Tags.TagID = LinkTags.TagID
GROUP BY LinkTags.TagID
ORDER BY (COUNT(LinkTags.LinkID)) DESC
LIMIT 10
但是,使用这种结构,允许多个标记?@Frencesc,是的,这种结构允许每个链接有多个标记。而且,我必须用逗号分隔标记id?默认情况下,GROUP_CONCAT用逗号分隔结果。您不会在任何地方存储逗号。您不必使用GROUP_CONCAT来获得结果。尝试另一个查询。
标记的链接
不应该是链接标签
?
CREATE TABLE links (
id int(10)
...
,primary key(id)
);
CREATE TABLE tags (
id int(10)
,tag varchar(20)
,primary key(id)
);
CREATE TABLE tagged_links (
id int(10)
,tag int(10)
,link int(10)
,primary key(id)
,foreign key(tag) references tags(id)
,foreign key(link) references links(id)
);