在 MySQL 数据库中搜索相关/包含多个标签记录的书签
Search MySQL Database for Bookmarks that are related / contain multiple Tag records
我想添加使用 PHP 搜索我的书签 MySQL 记录的功能,并且能够组合 2-3 个标签以将我的结果过滤到包含我搜索中所有标签的记录而不是对包含单个标记值的所有记录的典型搜索。
Pinboard.in 书签服务允许您 search/filter 在整个站点和特定用户帐户上使用最多 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
数据库 table、Tags
数据库 table、Bookmark
table 和 tag_to_bookmark
关系 table
我可以用这个 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
现在如何制作包含 1、2 或 3 个标签的 SQL return 书签?
我的数据库结构:
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
);
如果我理解正确(你想检索所有具有 - 即 - 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
条件匹配具有指定值('OR' 运算符)的 id 的标签,GROUP BY
按 bookmarks.id
对结果进行分组 - 最后但必不可少 - HAVING
使用 2 个标签过滤结果(没有它查询 returns 书签具有 tags.id =1 OR 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 个或更多标签的书签,您可以使用以下函数,您可以使用 queryTag(1)
或 queryTag(1,2)
或 queryTag(3,5,6)
等。 .:
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()."
";
}
我希望 return 每个检索到的书签的所有标签(当书签有多个搜索到的标签时)...但我做不到!
我想添加使用 PHP 搜索我的书签 MySQL 记录的功能,并且能够组合 2-3 个标签以将我的结果过滤到包含我搜索中所有标签的记录而不是对包含单个标记值的所有记录的典型搜索。
Pinboard.in 书签服务允许您 search/filter 在整个站点和特定用户帐户上使用最多 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
数据库 table、Tags
数据库 table、Bookmark
table 和 tag_to_bookmark
关系 table
我可以用这个 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
现在如何制作包含 1、2 或 3 个标签的 SQL return 书签?
我的数据库结构:
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
);
如果我理解正确(你想检索所有具有 - 即 - 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
条件匹配具有指定值('OR' 运算符)的 id 的标签,GROUP BY
按 bookmarks.id
对结果进行分组 - 最后但必不可少 - HAVING
使用 2 个标签过滤结果(没有它查询 returns 书签具有 tags.id =1 OR 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 个或更多标签的书签,您可以使用以下函数,您可以使用 queryTag(1)
或 queryTag(1,2)
或 queryTag(3,5,6)
等。 .:
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()."
";
}
我希望 return 每个检索到的书签的所有标签(当书签有多个搜索到的标签时)...但我做不到!