Хобрук: Ваш путь к мастерству в программировании

sql присоединиться к соединению?

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

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

У меня много файлов. Один из них называется «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», а также имя и идентификатор «firstLink» (первая ссылка), запрашивая все файлы на основе наименьшего идентификатора папки и ссылки?

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

В результате получается запись вида:

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

Спасибо!


  • Под «первым» вы имеете в виду самый низкий идентификатор? 15.07.2010
  • Я добавил тег greatest-n-per-group. Попробуйте нажать на этот тег, и вы увидите множество других случаев аналогичной проблемы с решениями. Попробуйте прочитать некоторые из них, а затем вернитесь и отредактируйте свой вопрос с тем, что вы пробовали (всегда лучше сделать домашнее задание самостоятельно). Извините, мне пришлось удалить ваш тег subselect, потому что существует ограничение в пять тегов. Но вам не обязательно нужен подзапрос для решения этой проблемы. 15.07.2010
  • @Wrikken - да, самый низкий идентификатор. @bill - спасибо за редактирование, хотя я достаточно новичок в SQL, поэтому я действительно не понимаю, как связано наибольшее число n на группу? Я думаю, что я просто присоединяюсь...? Я копался на этом форуме и в Интернете в течение часа, прежде чем опубликовать. 15.07.2010

Ответы:


1

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

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

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

files.Id, files.Name, links.Id, links.Name (4 столбца)

Q1:

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 с таблицей папок необязательно)

Q2:

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

15.07.2010
  • Спасибо - я подумал об этом вскоре после публикации, но этого не было в моем редактировании. Это там сейчас. 15.07.2010
  • Вот и все! Два внутренних соединения! Вот чего мне не хватало. Спасибо! 15.07.2010

  • 2

    Это выбирает все ссылки для файла с идентификатором 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, добавьте ограничение или что-то еще для других вещей, которые вы хотите. Это должно быть просто изменить.

    15.07.2010
  • Извините, я неправильно сформулировал свой вопрос. Я хочу получить имя и идентификатор ссылки вместе с данными записи для файла. Так что это не отдельные запросы. 15.07.2010

  • 3

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

    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
    

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

    15.07.2010

    4

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

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

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

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

    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;
    
    15.07.2010
    Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..