2014-04-01 95 views
0

標題聽起來有點複雜,但很難解釋沒有示例的含義。基於其他行值查詢SQL表中的數據

所以我有樹表SQL數據庫:

照片:

+------------+------------------+------+-----+-------------------+-----------------------------+ 
| Field  | Type    | Null | Key | Default   | Extra      | 
+------------+------------------+------+-----+-------------------+-----------------------------+ 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_increment    | 
| hash  | varchar(256)  | NO | MUL | NULL    |        | 
| path  | varchar(1024) | NO | MUL | NULL    |        | 
| store_date | timestamp  | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+------------+------------------+------+-----+-------------------+-----------------------------+ 

tags_names:

+-------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+------------------+------+-----+---------+----------------+ 
| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name | varchar(64)  | NO | UNI | NULL |    | 
| type | int(11)   | NO |  | NULL |    | 
+-------+------------------+------+-----+---------+----------------+ 

標籤:

+----------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+----------+------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| value | varchar(2048) | YES |  | NULL |    | 
| name_id | int(10) unsigned | NO | MUL | NULL |    | 
| photo_id | int(10) unsigned | NO | MUL | NULL |    | 
+----------+------------------+------+-----+---------+----------------+ 

Photos是製表與關於照片的數據(id,照片和sha哈希路徑)。

Tag_names收集有關可能的標籤(ID,標籤的名字和類型,我在我的程序映射到正確的類型像字符串,數字,日期等)的信息

Tags包含有關該照片包含的信息與標籤標記值: name_id是對tag_names.id的引用,photo_id是對photos.id的引用,value是標記的值。

我遇到的問題是我想要以樹形式顯示數據庫中的數據。 一個例子:一個根節點將有子節點,這些節點的名字將是一個日期。 tag_names表中會有一個「Date」標籤,並且會在標籤表中引用該名稱(通過tags.name_id)和不同的值。

左右的可視化:

select * from tag_names; 
+----+------+------+ 
| id | name | type | 
+----+------+------+ 
| 1 | Date | 1 | 
+----+------+------+ 

select * from tags; 
+----+------------+---------+----------+ 
| id | value  | name_id | photo_id | 
+----+------------+---------+----------+ 
| 1 | 2011.05.19 |  1 |  1 | 
| 3 | 2011.05.20 |  1 |  2 | 
+----+------------+---------+----------+ 

會是這樣的一棵樹:

root 
| 
+--- 2011.05.19 
    | 
    +---- photo 1 
    | 
    2011.05.20 
    | 
    +---- photo 2 

我可以與tags適當的查詢非常方便地實現它。 但是我希望能夠在樹中創建兩個(或更多)級別。

可以說我希望在我的樹上有日期和時間。 我仍然可以收集來自第一級的數據(找到名稱爲「Date」的標記的所有可能值),但是我希望找到「Time」標記的所有可能值,但僅適用於具有特定「Date」標記的照片。

所以我需要在tags上做一個select,其中標籤名稱等於「時間」,並且帶有相關photo_id的照片還包含具有一個特定值的標籤「日期」。

是否可以使用我的表格佈局? 我總是可以緩存一些數據,這是我最後的手段,但是我很好奇,如果這樣的問題可以直接用SQL解決。

編輯:下面

查詢照片上一個例子(在評論中問道):

'1', 'cda6bfe0fd7a588704e1ebc81f8ef4b3c884895afadf0d0c97892db8f6d9cc91', '/DSCF9529.JPG', '2014-03-23 16:19:26' 
'2', 'cda6bfe0fd7a588704e1ebc81f8ef4b3c884895afadf0d0c97892db8f6d9cc91', '/DSCF9529.JPG', '2014-03-23 16:19:26' 
'3', 'e213df3f22276173c2e07a8c4ec9e83aee73605196d4e2aa529fbb34ceb6f86d', '/DSCF9532.JPG', '2014-03-23 16:19:26' 
'4', '681a7c723ce16908c0fc73ed819de9a1af7c19cbd6fbcb7bf1c238a9d0378c2f', '/DSCF9531.JPG', '2014-03-23 16:19:26' 
'5', 'd586eaae7d0fd625ec6282a51d12625db341c72d9395efd9e142850e457272ca', '/DSCF9537.JPG', '2014-03-23 16:19:26' 
'6', 'dc1c40ce690c42f9fa9edc0f5020e01ca8e0c59694108d49f942b79b0167ef10', '/DSCF9222.JPG', '2014-03-23 16:19:26' 
'7', '518884037e9d67ccbee98f6805cf7bb5ccf4c6f2e7aa35efe3c834e7c7ad3c32', '/DSCF9534.JPG', '2014-03-23 16:19:26' 
'8', '21d33a2c5a25515689d68885d7d485aa89b96b7e5929a86ef658e53b61c7266b', '/DSCF9221.JPG', '2014-03-23 16:19:26' 
'9', 'ff7ea451ce772b9d18c706dc9b989a1a318491e5d0f095575bf5dd6cc6448ab0', '/DSCF9530.JPG', '2014-03-23 16:19:26' 
+0

您可以添加用於獲取第一級別的查詢嗎? - 基本上,你將不得不做一個選擇的選擇和加入一個選擇的時間有你的日期標記 –

+0

這裏是我的選擇: 選擇photos.id,tag_names.name,tags.value從標記左加入(照片, tag_names)ON(photos.id = tags.photo_id AND tag_names.id = tags.name_id)WHERE name ='Date'; 你可以舉例嗎?那些是我使用SQL –

+0

進行查詢的第一步嗎?喜歡它拉出你想要的? –

回答

1

此查詢選擇標記名稱「DATE」的所有照片,然後選擇與照片標籤名稱爲「TIME」的相同ID是您想要的嗎?請參見FIDDLE工作示例

SELECT 
    * 
FROM 
(
    SELECT p.id AS p_id FROM photo p 
    JOIN tag t ON t.photo_id = p.id 
    JOIN tag_name tn ON tn.id = t.name_id 
    WHERE tn.name = 'Date' 
) AS ti 
JOIN tag t1 ON t1.photo_id = p_id 
JOIN tag_name tn1 ON tn1.id = t1.name_id 
WHERE tn1.name = 'Time' 
+0

是的,它的工作原理。我添加了更多的數據,使其更加複雜,看起來像是有效的。現在我需要嘗試去理解它;) –

+0

好吧,讓我幫忙:)...首先你運行內部查詢。只能獲取標籤名稱爲「DATE」的照片。以及那些照片是他們的ID。因此我然後將其他表格與與僅具有「DATE」作爲標籤名稱的照片相關的ID加入。從那裏你現在說給我的標籤名稱「時間」 –

+0

當我做'JOIN標記t1'注意到它的ON t1.photo_id = p_id' --- p_id是別名我給了子查詢中的photo_id –