2012-07-10 57 views
0

我必須從非常舊的mysql數據庫(大約在2003年)做出報告。所以風格很糟糕。 結構是該表具有列:id,類型,字段,值。在這些領域是所有的信息,但對於一個ID有很多條目。如果通常數據將被存儲爲:id,名稱,速度,服務,項目等,那麼在這個表中,數據存儲爲:id(用於多行),type,field(這裏放置名稱,速度,服務。 ......但只是其中的一個),價值(領域'領域'的價值)。 但我需要結合這個表數據爲每個id(其中是每個id與多個條目)與表之間的連接,然後與第三個表(它實際上是第一個表,但與不同的id)相結合。我寫了一個腳本,但速度非常慢,PHP無法在30秒內執行它。也許我應該寫腳本的一些方向?從錯誤的格式化數據庫檢索數據

表 「基地」:

id | type | field | value 

表 「連接」:

master | slave 

我從表 「基地」 過濾的 「類型」 的數據,然後讓第一行和正確的數據,然後循環,而從表「連接」「主」指向「基」項目與我需要的「類型」,並獲得正確的數據。 和全腳本太慢:

http://paste.php.lv/ce693aee64e9617b509e336b25e3262f?lang=php

+0

附註:這聽起來像是鍵值存儲,並且在某些形式和情況下,比每欄有一列更有效d。 – Sherlock 2012-07-10 11:50:51

+0

是的,它可能是這樣的,它可能更有效,但使用這張桌子非常困難。 – dpitkevics 2012-07-10 11:53:49

回答

1

你有做連接。

「正常」 查詢:

SELECT SUM(value) FROM products WHERE product_name = "stanchion"; 

「你」 的查詢,如果我理解正確的:

SELECT SUM(v.value) FROM bigtable v JOIN bigtable p ON (v.key = p.key AND v.field = "value" AND p.field = "product_name") WHERE p.value = "stanchion"; 

您可能要在一個多餐桌的全BigTable中翻譯:

CREATE TABLE translated [AS] 
SELECT v.key AS product_id, v.value AS value, 
    p.value AS product_name, 
    s.value AS stock, 
    ... 
    FROM bigtable v 
    JOIN bigtable p ON (v.key = p.key AND v.field = "value" AND p.field = "product_name") 
    JOIN bigtable s ON (v.key = s.key AND v.field = "value" AND s.field = "stock")