我想添加使用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/

我现在有一个UsersDB表,TagsDB表,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 BYbookmarks.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个或更多标记的书签,您可以使用以下功能,即您可以使用asqueryTag(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/

10-14 13:48