2017-06-16 57 views
0

我有一個索引表,每個記錄有一個記錄ID和一個數據類型字段 我也有4個數據表,全部具有相同的字段。 如何從索引表中檢索x記錄並基於數據類型的值,將THAT記錄加入到適當的數據表中並將整個批次返回到單個記錄集中? 例如: indexrec1具有recordid = 12和datatype = text,其餘字段將來自文本表中對應於recordid = 12的文本表。 indexrec2的recordid爲9,datatype = image,其餘字段將來自圖像表中對應於recordid = 9的圖像表。根據主表中的字段值,加入每個記錄的備用表

  1. 這是可能的,如果是這樣,我該怎麼做。
  2. 如果可能,那麼它會比從索引表中檢索記錄更快,然後在相應的數據表上執行單獨的sql qry?

這將在PHP下的Apache服務器上運行。 請溫柔,我不是一個MySQL專家 - 一個「白癡指南」的答案將是巨大的,如果它是可能的...

+0

你可以用'JOIN'鏈接桌子在一起。 – Eric

+0

謝謝埃裏克 - 我試過了,並在返回的記錄和太多的數據太多領域結束了。另外,一個數據表中的記錄6與另一個數據表中的記錄6沒有任何關聯。 生成的記錄集將嚴重影響服務器上可用的內存。 – MadMan

+0

如果你正在做'select * from',那麼它將返回每個表的所有數據,如果你只列出你感興趣的字段,這將更容易管理。 –

回答

0

你需要的是一個查詢與聯接到每一個需要

錶鏈接例如:

select rec1.indexrec1,rec2.* from rec1 
inner join [text table] as rec2 on 
rec1.indexrec1 = rec2.indexrec2 

我在做什麼?那麼我通過內部連接使用indexrec列鏈接它們,以顯示[rec1]表中的索引和[text table] as rec2中的所有列。

雖然有一個問題,但使用inner join將只顯示符合此條件的記錄rec1.indexrec1 = rec2.indexrec2

取決於在你真正需要的,你可以使用diferent Joins

瞭解更多關於joinhttps://www.w3schools.com/sql/sql_join.asp

+0

w3schools?朋友不要讓朋友使用w3schools;太舊,虛假的東西。小心。 –

+0

「抓」是抓住我的。這是我第一次嘗試... – MadMan

+0

如果有很多記錄或使用其他連接方法,您應該使用'where'的更多條件,嘗試'left join'或'right join' –

0

,與每個表一個單獨的查詢,並與UNION將它們結合起來。

SELECT * 
FROM indexTable AS i 
JOIN textTable AS t ON i.recordId = t.recordId 
WHERE i.datatype = 'text' AND i.recordId = 12 

UNION ALL 

SELECT * 
FROM indexTable AS i 
JOIN imageTable AS im ON i.recordId = im.recordId 
WHERE i.datatype = 'image' AND i.recordId = 12 

繼續所有類型的這種模式。

但是,如果所有的數據表都有相同的字段,爲什麼你把它們作爲單獨的表?

+0

不會導致大量的數據集? 點2是索引表中的id引用索引表中數據類型字段指示的數據表中的id。 – MadMan

+0

如果你正在尋找一個特定的ID,它不會很大。我已經添加到WHERE條款。 – Barmar

+0

正在存儲的數據在不同的表中發生變化。一個表將有一個「註釋」字段(類型=測試),而另一個表不需要它,所以在第二個表中的註釋字段是一個字符,從而節省空間和加載時間。 它也有一個處理密集型操作,我需要做改變,我試圖讓操作更容易(而不是在瀏覽器上超時) – MadMan

0

它確實「有效」,但沒有給出預期結果。

我創建了一個索引表,一個文本表和一個nums表 - 後者2具有相同的字段名稱。

然後我創建了2個索引記錄,一個用於訪問文本表中的記錄,另一個用於訪問nums表中的記錄。 (在文本和NUMS創建一個記錄)

然後,我跑到下面的SQL:

選擇test_indextest_idtest_indexdatatypetest_indexexternalrecidtest_indexsomethingtest_numsrec_idtest_numsdatatypetest_numsvalue1test_numsvalu2test_textrec_idtest_textdatatypetest_textvalue1test_textvalu2 FROM test_index LEFT JOIN test_nums ON test_numsdatatype = test_indexdatatype LEFT JOIN test_text ON test_textdatatype = test_indexdatatype

PHPMyAdmin results screenshot

然後我跑在PHP腳本相同的SQL和print_r的倒是生成的行,並得到這樣的:

陣列([爲test_id] => 1 [數據類型] => text [externalrecid] => 1 [something] => indextable [rec_id] => 1 [value1] => text value 1 [valu2] => text value 2)

Array([test_id] => 2 [datatype] => [externalrecid] => 1 [something] =>應該是nums [rec_id] => [VALUE1] => [valu2] =>)

正如你可以看到,在第二陣列(記錄集)的字段中的值丟失。

因此,我得出結論:給定字段名稱的第二個值會覆蓋第一個值,因此我不能使用此方法。

在第二個數組轉儲中,我需要的值位於第一組字段名稱中,但它們會被第二組的NULL值覆蓋。不好!!!

但光明的一面:

如果我改變字段名,使他們在次級表,我會得到所有表中的所有字段都是唯一的。

更好的消息是,所有不需要的字段(儘管存在)都有NUL值,這意味着整個記錄集的大小(以字節爲單位)將大大減少,這是我開始時的最初目標。

我的(自家種植的)模板引擎需要進行修改,以便測試BEFORE將值解析到模板中的值(處理中減少了近75%),並且應該使所有內容都加速我的第二個目標)

感謝所有誰參加 - 希望這可以幫助其他人在未來的 - 正如我所說的前面,我不是一個MySQL專家...

相關問題