sql 查询 firefox places.sqlite 中的标签
sql query on tags in places.sqlite of firefox
如何显示 Places.sqlite 数据库中具有相同标签 'press_germany' 的书签。
我使用 SQLite 管理器扩展以及 SQLite 软件的数据库浏览器。
我没有看到任何 table 标签,我不知道 firefox 如何创建这些标签。
我发现接近我的目标的所有内容都在以下链接中:
我尝试了这个查询,但它显示了 0 个结果:
SELECT moz_places.url, moz_places.title
FROM moz_places
LEFT OUTER JOIN moz_bookmarks
ON moz_places.id = moz_bookmarks.fk
WHERE moz_bookmarks.title = 'press_germany'
谢谢。
places.sqlite 架构(如果有帮助):
Mozilla Developer The Places database
注意:基于 Firefox dev 63.0b6
仔细查看moz_bookmarks
中的数据。具有标签标题的行中的 fk
是什么?
真正的线索在文档中 [强调我的]:
moz_bookmarks: This table contains bookmarks, folders, separators and tags, and defines the hierarchy. The hierarchy is defined via the parent column, which points to the moz_bookmarks
record which is the parent. The position column numbers each of the peers beneath a given parent starting with 0 and incrementing higher with each addition. The fk column provides the id number of the corresponding record in moz_places.
这些表被紧密引用,因此 join
似乎没有必要。您可以从
开始
FROM moz_places,moz_bookmarks tag, moz_bookmarks childs
看看它会带你去哪里。
--附录-->
您需要来自 moz_bookmarks
的两个 "types" 行,它们是互斥的。 "tag" 行,它有一个标题和一个 id,但是 fk
是 NULL。 moz_bookmarks
中的 "child" 行有一个 parent_key
匹配 "tag" 行的 id
和一个 fk
(这是 id moz_places
).
中相应行的
这里的关键是使用"self join"。我发现 this tutorial 可以帮助您了解这个概念并构建有效的查询。在您的情况下,'FROM' 子句将包括 moz_places
。
关于评论中发布的查询:没有行会匹配,因为它明确选择了 fk = NULL
的行,并且 moz_places 中没有 id = NULL
的行。
我想我成功列出了我的 'press_germany' 标签。
select * from(
SELECT x.id, x.title as Tag,z.url as Location
FROM moz_bookmarks x, moz_bookmarks y,moz_places z
WHERE x.id = y.parent and y.fk = z.id
)where Tag like 'press_germany'
最后一件事:我想列出我的结果如下:
{id - Name - Location} 但我不知道如何获取 'Name' 列。
MartinStettner's 模式响应非常具有解释性。 'Name' 的值将在第一行 (Whosebug) 的 'title' 字段中检索。请再次帮助。
当您在 Firefox 中创建标签时,它会在 moz_bookmarks 中创建一个条目,其中标题列将包含标签,以及 fk(指向 moz_places.id 的外键)。下面的任何书签该标签将 moz_bookmarks.parent 指向标签的 ID。因此,您需要做的第一件事就是找到标签的 ID。
SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL
通过包含 AND 语句,您可以确保命中标签。如果它是一个实际的书签,则 fk 将具有一个值。我们不希望那样,我们希望 fk 为 NULL。
现在我们有了它,我们需要在查询中使用它。您可以按如下方式进行:
SELECT moz_bookmarks.title
FROM moz_bookmarks, (SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL) tag
WHERE moz_bookmarks.parent == tag.id
请注意,在上面的查询中,我们在 FROM 语句中使用了第一个查询的结果(很像您所做的 - 但对那些可能不熟悉的人进行评论),并将其结果分配给别名'tag'(您可以选择您可能知道的任何别名,只是不要使用保留字或与字段名称产生冲突)。
我怀疑你的最终陈述看起来像这样(如果不是,我很确定你可以从那里进行调整):
SELECT moz_places.id, moz_bookmarks.title, moz_places.url
FROM moz_bookmarks, (SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL) tag
LEFT OUTER JOIN moz_places
ON moz_places.id == moz_bookmarks.fk
WHERE moz_bookmarks.parent == tag.id
上面不会做递归列表。换句话说,如果文件夹中有 sub-folders,则 sub-folder 名称将列在查询中,但不会列出其内容,包括 sub-sub 个文件夹。
如果您想递归地提取所有书签,这是我通过接受其他人的查询并对其进行调整而得出的查询。除此之外,我不擅长递归查询。
WITH RECURSIVE
under_root(id, level) AS (
VALUES (0,0)
UNION ALL
SELECT moz_bookmarks.id, under_root.level+1
FROM moz_bookmarks JOIN under_root ON moz_bookmarks.parent=under_root.id
ORDER BY 2 DESC
)
SELECT substr('.....................................................................................................',1,level*5) || moz_bookmarks.title AS "TITLE", CASE WHEN moz_places.url is null THEN "" ELSE moz_places.url END AS "URL", datetime(moz_bookmarks.dateAdded/1000000,"UNIXEPOCH","LOCALTIME") AS "Date Added", datetime(lastModified/1000000,"UNIXEPOCH","LOCALTIME") AS "Last Modified", CASE WHEN datetime(moz_places.last_visit_date/1000000,"UNIXEPOCH","LOCALTIME") IS null THEN "" ELSE datetime(moz_places.last_visit_date/1000000,'UNIXEPOCH','LOCALTIME') END AS "Last Visit Date", CASE WHEN moz_places.visit_count IS null OR moz_places.visit_count=0 THEN "" ELSE moz_places.visit_count END FROM moz_bookmarks JOIN under_root ON moz_bookmarks.id=under_root.id LEFT JOIN moz_places on moz_places.id=moz_bookmarks.fk;
我的目标是搁置一个待办项目对应的标签,从而减轻我的书签(20万个书签约3000个标签,可见firefox非常强大)。
我可以使用 DB Browser for SQLite 以 csv 格式导出这些标签,并获得一个 xlsx 文件。
这段代码非常适合我:只是标签的名称和位置。
select * from
( SELECT x.title as Tag, w.title as Name, z.url as Location
FROM moz_bookmarks x, moz_bookmarks y,moz_places z,moz_bookmarks w
WHERE x.id = y.parent and y.fk = z.id and w.fk = z.id )
where Tag == 'press_germany' and Name IS NOT NULL
感谢贡献者。
如何显示 Places.sqlite 数据库中具有相同标签 'press_germany' 的书签。 我使用 SQLite 管理器扩展以及 SQLite 软件的数据库浏览器。 我没有看到任何 table 标签,我不知道 firefox 如何创建这些标签。
我发现接近我的目标的所有内容都在以下链接中:
我尝试了这个查询,但它显示了 0 个结果:
SELECT moz_places.url, moz_places.title
FROM moz_places
LEFT OUTER JOIN moz_bookmarks
ON moz_places.id = moz_bookmarks.fk
WHERE moz_bookmarks.title = 'press_germany'
谢谢。
places.sqlite 架构(如果有帮助): Mozilla Developer The Places database
注意:基于 Firefox dev 63.0b6
仔细查看moz_bookmarks
中的数据。具有标签标题的行中的 fk
是什么?
真正的线索在文档中 [强调我的]:
moz_bookmarks: This table contains bookmarks, folders, separators and tags, and defines the hierarchy. The hierarchy is defined via the parent column, which points to the
moz_bookmarks
record which is the parent. The position column numbers each of the peers beneath a given parent starting with 0 and incrementing higher with each addition. The fk column provides the id number of the corresponding record in moz_places.
这些表被紧密引用,因此 join
似乎没有必要。您可以从
开始
FROM moz_places,moz_bookmarks tag, moz_bookmarks childs
看看它会带你去哪里。
--附录-->
您需要来自 moz_bookmarks
的两个 "types" 行,它们是互斥的。 "tag" 行,它有一个标题和一个 id,但是 fk
是 NULL。 moz_bookmarks
中的 "child" 行有一个 parent_key
匹配 "tag" 行的 id
和一个 fk
(这是 id moz_places
).
这里的关键是使用"self join"。我发现 this tutorial 可以帮助您了解这个概念并构建有效的查询。在您的情况下,'FROM' 子句将包括 moz_places
。
关于评论中发布的查询:没有行会匹配,因为它明确选择了 fk = NULL
的行,并且 moz_places 中没有 id = NULL
的行。
我想我成功列出了我的 'press_germany' 标签。
select * from(
SELECT x.id, x.title as Tag,z.url as Location
FROM moz_bookmarks x, moz_bookmarks y,moz_places z
WHERE x.id = y.parent and y.fk = z.id
)where Tag like 'press_germany'
最后一件事:我想列出我的结果如下: {id - Name - Location} 但我不知道如何获取 'Name' 列。 MartinStettner's 模式响应非常具有解释性。 'Name' 的值将在第一行 (Whosebug) 的 'title' 字段中检索。请再次帮助。
当您在 Firefox 中创建标签时,它会在 moz_bookmarks 中创建一个条目,其中标题列将包含标签,以及 fk(指向 moz_places.id 的外键)。下面的任何书签该标签将 moz_bookmarks.parent 指向标签的 ID。因此,您需要做的第一件事就是找到标签的 ID。
SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL
通过包含 AND 语句,您可以确保命中标签。如果它是一个实际的书签,则 fk 将具有一个值。我们不希望那样,我们希望 fk 为 NULL。
现在我们有了它,我们需要在查询中使用它。您可以按如下方式进行:
SELECT moz_bookmarks.title
FROM moz_bookmarks, (SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL) tag
WHERE moz_bookmarks.parent == tag.id
请注意,在上面的查询中,我们在 FROM 语句中使用了第一个查询的结果(很像您所做的 - 但对那些可能不熟悉的人进行评论),并将其结果分配给别名'tag'(您可以选择您可能知道的任何别名,只是不要使用保留字或与字段名称产生冲突)。
我怀疑你的最终陈述看起来像这样(如果不是,我很确定你可以从那里进行调整):
SELECT moz_places.id, moz_bookmarks.title, moz_places.url
FROM moz_bookmarks, (SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL) tag
LEFT OUTER JOIN moz_places
ON moz_places.id == moz_bookmarks.fk
WHERE moz_bookmarks.parent == tag.id
上面不会做递归列表。换句话说,如果文件夹中有 sub-folders,则 sub-folder 名称将列在查询中,但不会列出其内容,包括 sub-sub 个文件夹。
如果您想递归地提取所有书签,这是我通过接受其他人的查询并对其进行调整而得出的查询。除此之外,我不擅长递归查询。
WITH RECURSIVE
under_root(id, level) AS (
VALUES (0,0)
UNION ALL
SELECT moz_bookmarks.id, under_root.level+1
FROM moz_bookmarks JOIN under_root ON moz_bookmarks.parent=under_root.id
ORDER BY 2 DESC
)
SELECT substr('.....................................................................................................',1,level*5) || moz_bookmarks.title AS "TITLE", CASE WHEN moz_places.url is null THEN "" ELSE moz_places.url END AS "URL", datetime(moz_bookmarks.dateAdded/1000000,"UNIXEPOCH","LOCALTIME") AS "Date Added", datetime(lastModified/1000000,"UNIXEPOCH","LOCALTIME") AS "Last Modified", CASE WHEN datetime(moz_places.last_visit_date/1000000,"UNIXEPOCH","LOCALTIME") IS null THEN "" ELSE datetime(moz_places.last_visit_date/1000000,'UNIXEPOCH','LOCALTIME') END AS "Last Visit Date", CASE WHEN moz_places.visit_count IS null OR moz_places.visit_count=0 THEN "" ELSE moz_places.visit_count END FROM moz_bookmarks JOIN under_root ON moz_bookmarks.id=under_root.id LEFT JOIN moz_places on moz_places.id=moz_bookmarks.fk;
我的目标是搁置一个待办项目对应的标签,从而减轻我的书签(20万个书签约3000个标签,可见firefox非常强大)。 我可以使用 DB Browser for SQLite 以 csv 格式导出这些标签,并获得一个 xlsx 文件。 这段代码非常适合我:只是标签的名称和位置。
select * from
( SELECT x.title as Tag, w.title as Name, z.url as Location
FROM moz_bookmarks x, moz_bookmarks y,moz_places z,moz_bookmarks w
WHERE x.id = y.parent and y.fk = z.id and w.fk = z.id )
where Tag == 'press_germany' and Name IS NOT NULL
感谢贡献者。