SQL запрос на теги в местах. Вопрос Firefox - PullRequest
0 голосов
/ 15 сентября 2018

Как отобразить закладки с одинаковым тегом «press_germany» из базы данных Places.sqlite.Я использую расширение SQLite Manager, а также браузер БД для программного обеспечения SQLite.Я не вижу ни одной таблицы тегов и не знаю, как firefox создает эти теги.

Все, что я нашел, приближаясь к моей цели, находится в следующих ссылках:

stackoverflow, superuser.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'

Спасибо.

Схема place.sqlite, если полезно: Mozilla Developer База данных Places

Ответы [ 4 ]

0 голосов
/ 01 октября 2018

Моя цель - отложить в сторону теги, соответствующие проекту, и таким образом облегчить мои закладки (200 000 закладок для примерно 3000 тегов, что показывает, что Firefox очень устойчив). Я могу экспортировать эти теги в формате csv с помощью DB Browser для SQLite и получить файл 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

спасибо авторам.

0 голосов
/ 16 сентября 2018

Я думаю, что мне удалось перечислить мои теги '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 очень объяснителен. значения 'Name' должны быть получены в поле 'title' первой строки (stackoverflow). Пожалуйста, помогите снова.

0 голосов
/ 19 сентября 2018

Когда вы создаете тег в Firefox, он создает запись в moz_bookmarks, где столбец заголовка будет содержать тег, и fk (внешний ключ, который указывает на moz_places.id. Любые закладки под этим тегом будут иметь указатель moz_bookmarks.parent.к идентификатору тега. Итак, первое, что вам нужно сделать, это найти идентификатор тега.

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' (вы можете выбрать любой псевдоним, какой захотите, как вы, вероятно, знаете, только не используйте зарезервированное слово или создайте столкновение с именем поля).

Ваш последний stЯ подозреваю, что atement будет выглядеть примерно так (если нет, я уверен, что вы сможете настроить его оттуда):

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;
0 голосов
/ 15 сентября 2018

Примечание: на основе Firefox dev 63.0b6

Более внимательно посмотрите на данные в moz_bookmarks.Что такое fk в строке с заголовком тега?

Подлинная подсказка в документе [выделено мной]:

moz_bookmarks: Эта таблица содержит закладки, папки, разделители и теги и определяет иерархию. Иерархия определяется через родительский столбец, который указывает на запись moz_bookmarks, которая является родительским. Столбец позиции нумерует каждого из пиров под данным родительским элементом, начиная с 0 и увеличиваясь с каждым добавлением.Столбец fk содержит номер идентификатора соответствующей записи в moz_places.

Эти таблицы тесно связаны, поэтому join кажется ненужным.Вы можете начать с
FROM moz_places,moz_bookmarks tag, moz_bookmarks childs
и посмотреть, куда вас это приведет.

- ADDENDUM ->
Вам нужны два "типа" строк из moz_bookmarks, которые взаимноэксклюзив.Строка «tag», которая имеет заголовок и идентификатор, но fk имеет значение NULL.И "дочерние" строки из moz_bookmarks, которые имеют parent_key, который соответствует id строки "тега", и fk (который является идентификатором соответствующей строки в moz_places).

Ключом здесь является «самостоятельное соединение».Я нашел этот учебник , который может помочь вам изучить эту концепцию и создать рабочий запрос.А в вашем случае предложение FROM будет включать moz_places.

Что касается запроса, размещенного в комментариях: ни одна строка не будет совпадать, потому что он явно выбирает строки с fk = NULL, и в moz_places с id = NULL нет НИКАКИХ СТРОК.

...