2015-03-13 50 views
0

在當前數據庫的設計,我有所謂的「信息」,並開始與product_一些其他表主表(product_life_insurance,product_medical_insurance,...)選擇表名從SQL查詢中加入

-Leads Table : 
--ID 
--Product 
... 

-Product_Life_insurance Table : 
--ID 
--LeadID 
... 

的首席行:

ID 5 
Product: life_insurance 

一個product_life_insurance行:

ID 1 
LeadId 5 

..

是否有無論如何創建一個查詢來選擇來自Leads的表名稱並添加「product_」前綴,然後將其加入到產品表中?

我的意思是:

SELECT * 
FROM `leads` JOIN `product_life_insurance` ON `leads`.`id` = `product_life_insurance`.`leadID` 
WHERE `leads`.`id` = '5'; 

我想選擇的表名從leads表連接,並添加「product_」前綴,它和我的查詢中使用它。

謝謝:)

+0

你應該使用mysql的CONCAT函數。 – 2015-03-13 12:12:58

+2

您需要使用動態SQL或在您的應用程序中構建表名。具有相同結構的不同表格通常是數據庫設計不佳的標誌 - 至少它阻礙了寫入查詢。 – 2015-03-13 12:14:27

+0

@CFFavor感謝您指點我正確的方向,Iv'e從您今天學到了一件新的伴侶隊友:) 現在我可以做到: 'SELECT *,CONCAT('product_',product) AS product_table FROM'leads' WHERE'leads'.'id' ='1000'' – PayamB 2015-03-13 12:21:16

回答

1

你問:

有什麼辦法來創建一個查詢到從信息選擇表名和 添加「product_」前綴,然後將其加入到產品表?

答案是no。在純SQL中,您不能創建表名的變量,然後在查詢中使用它們。當然,您可以在您的主機php代碼中執行此操作。但是,您需要使用一個查詢來獲取表名,以及更多查詢來從該表名中獲取結果。

您還可以使用動態SQL。這是一個MySQL功能,允許您在MySQL服務器中動態創建SQL查詢文本,然後運行這些查詢。

這聽起來像你試圖存儲具有廣泛不同屬性的幾類實體(人壽保險,年金,車輛保險等)。

這爲您提供了一些架構設計選項。

  1. 你應該使用不同的表(因爲你正在做的),顯示在主表 實體(鉛)類(壽險),並加入 特定的表你需要什麼?

  2. 如果您嘗試將所有屬性強制轉換爲單個實體,則 會保留NULL或空白與特定類實體無關的屬性?

  3. 如果您使用鍵/值存儲爲您的實體, WordPress的wp_postmeta表呢?

如果您對屬性值進行大量搜索,則選項3有一個缺點:它要求您的屬性全部使用相同的數據類型進行存儲。該數據類型可能是varchar(n)。這意味着很難搜索數字屬性值的範圍。例如'10'被認爲是文字BETWEEN '1' AND '9',但這在數字上是無稽之談。你可以使用隱式類型轉換來解決這個問題,但是這會破壞索引的使用。也就是,

0+meta_value BETWEEN 0 AND 9 

強制比較在meta_value列上以數值方式工作。它有效,但速度不快。話雖如此,方案3迄今爲止是最靈活的;您可以在不更改表定義的情況下添加新屬性。

選項2和選項3的組合,將最常搜索的屬性值放入主表lead中,可能會產生最穩健的解決方案。

選項1 - 您現在的解決方案 - 是一種性能噩夢,當您無法承受時,它會等待您攻擊您:隨着應用程序的擴展。

注意:如果您使用的是MySQL的MariaDB分支,您的key_value表可以包含一個持久的索引虛擬列。例如,

meta_key VARCHAR(255), 
meta_value VARCHAR(255), 
meta_value_int BIGINT(20) AS (0+meta_value) PERSISTENT, 
meta_value_float FLOAT AS (CAST(meta_value AS DECIMAL(30,10))) PERSISTENT 

然後,您可以索引這些虛擬(與AS定義)欄和搜索他們快。 meta_value不以數字開頭的列在虛擬列中的值爲0

+0

是的,你是對的,它看起來像我不能在ON子句中使用別名 – PayamB 2015-03-13 12:28:33

+0

順便說一下,你有任何評論關於我的最後一條評論,我張貼在我的問題?謝謝 – PayamB 2015-03-13 12:36:43

+0

請看我最近的編輯。 – 2015-03-13 14:13:24