Firefox中places.sqlite标签上的sql查询

时间:2018-09-15 09:02:45

标签: sql sqlite firefox bookmarks

如何显示Places.sqlite数据库中具有相同标签“ press_germany”的书签。 我使用SQLite Manager扩展以及用于SQLite软件的数据库浏览器。 我看不到任何标签表,也不知道firefox如何创建这些标签。

所有我能达到的目标都在以下链接中:

stackoverflowsuperuser.com

我尝试了此查询,但结果为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

4 个答案:

答案 0 :(得分:0)

NB:基于Firefox dev 63.0b6

更仔细地查看moz_bookmarks中的数据。带有标签标题的行中的fk是什么?

真正的线索在文档[强调我的]:

  

moz_bookmarks:此表包含书签,文件夹,分隔符和标签,并定义层次结构。 层次结构是通过父级列定义的,该父级指向作为父级的moz_bookmarks记录。位置列编号是给定父级下每个对等方的编号,从0开始,然后以更高的顺序递增每次添加。 fk列提供moz_places中相应记录的ID号。

这些表是紧密引用的,因此似乎不需要join。您可以从
开始  FROM moz_places,moz_bookmarks tag, moz_bookmarks childs
 看看带你去哪里。

-附录->
您需要moz_bookmarks中两种互斥的行的“类型”。 “标签”行具有标题和ID,但fk为NULL。来自moz_bookmarks的“子”行具有parent_key与{tag”行的id匹配,而fk(对应行的ID)在moz_places中。

这里的关键是使用“自我加入”。我发现this tutorial可以帮助您学习此概念并建立有效的查询。在您的情况下,“ FROM”子句将包含moz_places

关于注释中发布的查询:没有行匹配,因为它显式选择了带有fk = NULL的行,并且带有id = NULL的moz_places中没有行。

答案 1 :(得分:0)

我想我已经列出了'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-名称-位置},但我不知道如何获取“名称”列。 MartinStettner's模式响应非常具有解释性。 “名称”的值将在第一行的“标题”字段中检索(stackoverflow)。请再次提供帮助。

答案 2 :(得分:0)

当您在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

以上内容不会做递归列表。换句话说,如果文件夹中有子文件夹,则子文件夹名称将在查询中列出,但不列出其内容,包括子子文件夹。

如果要递归拉所有书签,可以通过接受其他人的查询并对其进行调整来提出以下查询。除此之外,我不擅长递归查询。

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;

答案 3 :(得分:0)

我的目标是将与项目相对应的标签放在一旁,从而减轻我的书签的负担(200 000个书签对应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

感谢贡献者。