sql объединиться в join? - PullRequest
2 голосов
/ 15 июля 2010

Мне нужна ваша помощь в создании оператора SQL, я не могу обернуться.

В базе данных у меня есть четыре таблицы - файлы, папки, folder_files и ссылки.

Iесть много файлов.Один из них называется «myFile.txt».

У меня много папок."myFile.txt" есть в некоторых из них.Первая папка, в которой он появляется, называется «firstFolder».

У меня много ссылок на многие папки.Первая ссылка на «firstFolder» называется «firstLink».

Структура данных для примера будет такой:

// files
Id: 10
Name: "myFile.txt"

// folders
Id: 20
Name: "firstFolder"

// folder_files (join table)
Id: 30
Folder_Id: 20 (meaning "firstFolder")
File_Id: 1 (meaning "myFile.txt")

// links
Id: 40
Name: "firstLink"
Folder_Id: 20 (meaning "firstFolder")

ПЕРВЫЙ ВОПРОС: Как получить запись для «myFile».txt "И имя и идентификатор" firstLink "(первая ссылка), запрашивая файл с идентификатором = 10, основываясь на самом низком идентификаторе папки и ссылки?

ВТОРОЙ ВОПРОС: Как получитьзапись для «myFile.txt» И Имена и Id «firstLink» (первая ссылка), запрашивая все файлы, основываясь на самом низком Id папки и ссылки?

другими словами - какполучить первую ссылку на первую папку, содержащую «myFile.txt»?

В результате получается запись, которая выглядит следующим образом:

Id: 10
Name: "myFile.txt"
LinkId: 40
LinkName: "firstLink"

Спасибо!

Ответы [ 4 ]

3 голосов
/ 15 июля 2010

Вам следует подумать о том, как вы хотите, чтобы ваш набор результатов выглядел. SQL предназначен для описания наборов результатов. Если вы можете записать гипотетический набор результатов, вам может быть проще написать SQL, который будет отображать этот набор результатов.

Мне было трудно понять, что вы ищете, но я уверен, что это довольно прямая проблема. Я мог бы помочь вам проще, если бы вы могли более четко описать свои результаты, хотя вам больше не понадобится моя помощь!

Например (с оригинальной схемой) Q1 и Q2:

files.Id, files.Name, links.Id, links.Name (4 колонки)

1:

SELECT
  files.Id, files.Name, links.Id, links.Name
FROM
  files, links
INNER JOIN
  folder_files
  ON files.Id = folder_files.File_Id
INNER JOIN
  links
  ON links.Id = folder_files.Folder_Id
WHERE
  files.Id = 10
ORDER BY
  folder_files.File_Id ASC, links.Id ASC
LIMIT 1;

(JOIN с таблицей папок не требуется)

2:

Изменить оба ASC на DESC

1 голос
/ 15 июля 2010

При этом выбираются все ссылки для идентификатора файла 10:

select links.id, links.name
 from files
 left join folder_files on files.id = folder_files.file_id
 left join folders on folder_files.folder_id = folders.id
 left join links on links.folder_id = folders.id
 where files.id=10;

Измените предложение where, добавьте ограничение или что-то еще для других целей.Это должно быть просто изменить.

0 голосов
/ 15 июля 2010

Принимая во внимание:

  • больше папок на файл
  • больше ссылок на папку
  • с самой низкой папкой идентификатора для ссылки и самой низкой ссылкой идентификатора для папки

С помощью: mysql: group by ID, получить наивысший приоритет для каждого идентификатора

Ответ для ВСЕХ файлов в таблице файлов (перейти к JohnB'sрешение для одного файла, это было бы быстрее):

SELECT file_id, file_name, link_id, link_name FROM (
SELECT file_id, file_name, link_id, link_name,
    @r := CASE WHEN @prev_file_id = file_id
                    THEN @rn + 1
                    ELSE 1
               END AS r,
    @prev_file_id := file_id
FROM (
    SELECT
        f.id as file_id, f.name as file_name, l.id as link_id, l.name as link_name
    FROM files f
    JOIN folder_files ff
    ON ff.file_id = f.id
    JOIN links l
    ON l.folder_id = ff.folder_id
    ORDER BY ff.folder_id, l.id -- first folder first, first link to first folder second
) derived1,
(SELECT @prev_file_id := NULL,@r:=0) vars
) derived2
WHERE r = 1;
0 голосов
/ 15 июля 2010

Я бы попробовал это:

select f.*
        , l.Id as LinkId
        , l.Name as LinkName, 
    from Link l
        inner join Folder_Files ff on ff.Folder_Id = l.Folder_Id
        inner join Files f on f.Id = ff.File_Id
    where f.Id = 10

В результате:

 Id | Name       | LinkId | LinkName
 10 | myFile.txt | 40     | firstLink

Это то, что вы хотите?

...