2010-07-15 50 views
1

我需要你的幫助來構建一條SQL語句,我無法將我的頭圍繞。SQL連接加入嗎?

在數據庫中,我有四個表格 - 文件,文件夾,folders_files和鏈接。

我有很多文件。其中之一被稱爲「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」的名稱和「首聯」的ID的記錄(第一環節),根據文件夾的最低ID和鏈接查詢文件ID = 10?

第二個問題:如何獲取「myFile.txt」的記錄以及「firstLink」的名稱和ID(第一個鏈接),根據文件夾的最低ID和鏈接查詢所有文件?

換句話說 - 我如何獲得包含「myFile.txt」的第一個文件夾的第一個鏈接?

導致該看起來像一個紀錄:

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

謝謝!

+0

'先',你的意思是最低的ID? – Wrikken 2010-07-15 00:55:06

+2

我添加了標籤'最大n-per-group'。嘗試點擊該標籤,您將看到許多其他等效問題的情況,並提供解決方案。嘗試閱讀其中的一些內容,然後回過頭來用你所嘗試的方式編輯你的問題(自己做作業總是更好)。對不起,我不得不搶食'subselect'標籤,因爲有五個標籤的限制。但是你不一定需要一個子選擇來解決這個問題。 – 2010-07-15 01:19:10

+0

@Wrikken - 是的,最低的ID。 @bill - 感謝編輯,我對SQL新手夠了,我真的不明白每個組的最大優點?我想我只是在加入...?在發佈之前,我在這個論壇和網絡上挖了一個小時。 – user110218 2010-07-15 01:31:45

回答

2

您應該嘗試考慮如何讓結果集看起來。 SQL旨在描述結果集。如果你可以寫出一個假設的結果集,你可能會更容易編寫SQL來渲染結果集。

我很難理解你在找什麼,但我相信這是一個相當直接的問題。如果你能更清楚地描述你的結果,我會幫助你更輕鬆,儘管你可能不需要我的幫助了!

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使用文件夾表不是必要的)

例如Q1 & Q2(與你原來的模式去)

Q2:

變化都ASCDESC

+0

謝謝 - 我在發佈後不久就想到了它,但它並未在我的編輯中顯示出來。它現在在那裏。 – user110218 2010-07-15 01:28:29

+0

就是這樣!兩個內部連接!這就是我所錯過的。謝謝! – user110218 2010-07-15 13:21:11

1

這選擇文件編號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

對不起,我說錯了我的問題。我想獲取鏈接的名稱和ID以及文件的記錄數據。所以他們不是單獨的查詢。 – user110218 2010-07-15 01:08:54

0

我想試試這個:

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 

這是你想要的嗎?

0

考慮到:每個文件

  • 多個文件夾,每個文件夾
  • 更多的鏈接
  • 服用鏈路ID最低的文件夾,最低ID鏈接文件夾

的幫助作者:mysql: group by ID, get highest priority per each ID

文件表中所有文件的答案(go for Joh nB的單個文件解決方案,它會更快):

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;