2014-01-31 34 views
1

這是我的計算器上的第一個問題,但我一直在讀了多年至今的聲明。所以如果我的問題不恰當,請原諒。我一直在網上搜索幾個小時,但沒有找到任何東西。MySQL的:使用CONCAT()作爲在科拉姆名稱,其中一個子查詢

我目前優化MySQL數據庫上工作的系統的查詢。一張桌子上還擺着另一張桌子,以加速顯示這些數字的前端。我最終的查詢代碼代替多個其他查詢和循環...如果將它的工作:)

這是不按預期工作的一個:

SELECT 
v.*, 
(
    SELECT COUNT(DISTINCT i.display_item_id) 
    FROM search_index_item i 
    WHERE i.path LIKE '238/2/257/%' 
    AND i.scope_id = v.scope_id 
    AND CONCAT('i.attribute_', v.attribute_id) LIKE CONCAT('%|', v.attribute_value_id, '|%') 
) 
AS item_count 
FROM search_index_category_attribute_value v 
WHERE v.category_id = 257 

的查詢工作,所以到目前爲止,但計算出的「ITEM_COUNT」始終爲0。之所以它的0是語句「CONCAT(‘i.attribute_’,v.attribute_id)」,這似乎並沒有被作爲一個字段名處理。當我說好列名稱替換這一說法,它返回一個值:

SELECT 
v.*, 
(
    SELECT COUNT(DISTINCT i.display_item_id) 
    FROM search_index_item i 
    WHERE i.path LIKE '238/2/257/%' 
    AND i.scope_id = v.scope_id 
    AND i.attribute_7 LIKE CONCAT('%|', v.attribute_value_id, '|%') 
) 
AS item_count 
FROM search_index_category_attribute_value v 
WHERE v.category_id = 257 

現在這工作,但當然只是針對單個attribute_id(7)。作爲屬性ID被存儲在另一個表中,然後在一非歸一化表爲提高性能的目的保存爲單個列,我需要動態地創建列名。當然,我可以在代碼中做到這一點,但這是相當慢和不必要的。

你們是否有一個如何強制MySQL處理「CONCAT(‘i.attribute_’,v.attribute_id)」的想法作爲一個字段,而不是一個字符串?

預先感謝您!

+0

雖然看到你所做的事情總是很高興,並且你已經努力解決了這個問題,但爲適當的DDLs(和/或和sqlfiddle)一起提供所需的結果集也是很有用的我們可以更好地理解你究竟在做什麼。 (微微有點失望,這麼長時間的追隨者已經沒有把握) – Strawberry

回答

0

你的數據模型是有缺陷的。
如果無法規範化數據,然後嘗試這一條款改寫:

AND CONCAT('i.attribute_', v.attribute_id) LIKE CONCAT('%|', v.attribute_value_id, '|%') 

到這個怪物:

AND CASE v.attribute_id 
     WHEN 1 THEN i.attribute_1 
     WHEN 2 THEN i.attribute_2 
     WHEN 3 THEN i.attribute_3 
     WHEN 4 THEN i.attribute_4 
     ....... 
     ....... 
     ....... 
     WHEN 998 THEN i.attribute_998 
     WHEN 999 THEN i.attribute_999 
     WHEN 1000 THEN i.attribute_1000 
    END 
LIKE CONCAT('%|', v.attribute_value_id, '|%') 

這可能會工作,但它不會是快 - 此查詢必須始終做全表掃描,它不能使用任何索引。

相關問題