我想添加使用PHP搜索我的书签MySQL记录的功能,并且能够组合2-3个标记来将我的结果筛选到包含搜索中所有标记的记录,而不是包含单个标记值的所有记录的典型搜索。
Pinboard.in书签服务允许您在网站范围内搜索/筛选书签,并在特定的用户帐户上使用最多3个标记筛选结果。
Pinboard HowTo页面(https://pinboard.in/howto/#rss)显示:
最多可以按三个标记筛选源:
http://feeds.pinboard.in/rss/u:username/t:tag1/t:tag2/
http://feeds.pinboard.in/rss/u:username/t:tag1/t:tag2/t:tag3/
http://feeds.pinboard.in/rss/t:tag1/t:tag2/
我现在有一个
Users
DB表,Tags
DB表,Bookmark
表和tag_to_bookmark
关系表我可以使用以下SQL获取与书签记录相关的所有标记:
SELECT tags.name
FROM tags
JOIN bookmark_tag_relationship ON tags.id = bookmark_tag_relationship.tag_id
JOIN bookmarks ON bookmarks.id = bookmark_tag_relationship.bookmark_id
WHERE bookmarks.id = $bookmarkId
使用以下SQL获取单个标记的所有书签:
SELECT bookmarks.name
FROM bookmarks
JOIN bookmark_tag_relationship ON bookmarks.id = bookmark_tag_relationship.bookmark_id
JOIN tags ON tags.id = bookmark_tag_relationship.tag_id
WHERE tags.id = 1
现在,我如何使我的SQL返回书签包含1、2或3个标记?
我的数据库结构:
CREATE TABLE bookmark_tag_relationship (
bookmark_id NUMERIC,
tag_id TEXT
);
CREATE TABLE bookmarks (
id INTEGER PRIMARY KEY,
user_id NUMERIC,
name TEXT,
description TEXT,
url TEXT,
project_url TEXT,
github_url TEXT,
demo_url TEXT,
local_demo_url TEXT,
image1 TEXT,
image2 TEXT,
image3 TEXT,
image4 TEXT,
notes TEXT,
category TEXT,
tags TEXT,
click_count NUMERIC,
created DATETIME,
last_viewed DATETIME,
active NUMERIC
);
CREATE TABLE tags (
id INTEGER PRIMARY KEY,
user_id NUMERIC,
name TEXT,
description TEXT,
color TEXT,
bookmark_count NUMERIC,
active NUMERIC
);
CREATE TABLE users(
id INTEGER PRIMARY KEY,
NUMERIC,
first_name TEXT,
last_name TEXT,
user_name TEXT,
email TEXT,
password TEXT,
website TEXT,
photo_url TEXT,
bookmark_count NUMERIC,
active NUMERIC
);
最佳答案
如果我理解正确(您希望检索所有具有-e.e.-tags.id=1和tags.id=2的书签),那么对于我来说,此查询有效:
SELECT bookmarks.id, bookmarks.name, GROUP_CONCAT(tags.name) as foundtags
FROM tags
JOIN bookmark_tag_relationship ON tags.id = bookmark_tag_relationship.tag_id
JOIN bookmarks ON bookmarks.id = bookmark_tag_relationship.bookmark_id
WHERE ( tags.id IN (1,2) )
GROUP BY bookmarks.id
HAVING COUNT(DISTINCT tags.id) = 2
SELECT / FROM / JOIN
与获取与书签相关的所有标记的查询相同,WHERE
条件匹配指定值中id为的标记('OR'operator)、GROUP BY
按bookmarks.id
分组结果,HAVING
最后但必不可少的-queryTag(1)
用2个标记筛选结果(如果没有它,查询将返回具有tags.id=1或tags.id=2的书签)。通过简单的编辑,查询可以按标记名而不是标记id进行搜索:
SELECT bookmarks.id, bookmarks.name, GROUP_CONCAT(tags.name) as foundtags
FROM tags
JOIN bookmark_tag_relationship ON tags.id = bookmark_tag_relationship.tag_id
JOIN bookmarks ON bookmarks.id = bookmark_tag_relationship.bookmark_id
WHERE ( tags.name IN ('tag1','tag2') )
GROUP BY bookmarks.id
HAVING COUNT(DISTINCT tags.id) = 2
要简单地检索带有2、3个或更多标记的书签,您可以使用以下功能,即您可以使用as
queryTag(1,2)
或asqueryTag(3,5,6)
或as等:function queryTags()
{
return "
SELECT bookmarks.id, bookmarks.name, GROUP_CONCAT(tags.name) as foundtags
FROM tags
JOIN bookmark_tag_relationship ON tags.id = bookmark_tag_relationship.tag_id
JOIN bookmarks ON bookmarks.id = bookmark_tag_relationship.bookmark_id
WHERE ( tags.id IN (".implode(',',func_get_args()).") )
GROUP BY bookmarks.id
HAVING COUNT(DISTINCT tags.id) = ".func_num_args()."
";
}
我想返回每个检索到的书签的所有标记(当书签有超过个搜索标记时)。。。但我没能做到!
关于php - 在MySQL数据库中搜索相关/包含多个标签记录的书签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35248432/