2012-10-17 39 views
3

我有一張用於查找的表格,它將一個字段中的人類可讀值存儲在一個字段中,並且在另一個字段中刪除特殊字符和空格的相同文本。例如,值「Children's Shows」將作爲「兒童節目」出現在查閱列中。MySQL CONCAT'*'符號敬酒數據庫

不幸的是,相應的主表並不那麼簡單 - 由於歷史原因,我沒有創建自己,現在將難以撤消,查找值實際上是用周圍的星號存儲的,例如, '*兒童-節目*'。因此,當試圖加入帶有星號的主表的無星號查找表時,我想CONCAT會幫助我在即時添加它們,例如:

SELECT * 
     FROM main_table m 
INNER JOIN lookup_table l 
     ON l.value = CONCAT('*',m.value,'*') 

...然後表格是烤麪包。不知道我是否創建了一個無限循環或真的搞砸了數據,但它需要ISP備份才能讓表再次響應。我懷疑這是因爲'*'符號可能是保留的,就像通配符一樣,我已經要求數據庫做相當於舔自己的肘部。無論哪種方式,我都猶豫不決,試圖通過設法殺死數據庫的壯觀方式來找到答案。

在此先感謝任何能夠(a)告訴我上面實際對數據庫做了什麼的人,以及(b)我應該如何實際加入表格?

+0

+1讓DB舔自己的手肘一個字。而且,因爲我很好奇這個問題可能是什麼。 –

+0

'main_table'中有多少條記錄? –

+0

我認爲你的加入應該在兩張桌子上都有一些共同的ID,請嘗試使用限制。 –

回答

2

當使用CONCAT,MySQL不會使用索引。使用EXPLAIN來檢查這一點,但最近我遇到的一個問題是,在一個大表上,索引列在那裏,但沒有使用密鑰。但是,這不應該讓整個桌子變得麻木,只是讓它變慢。可能它耗盡內存,開始交換,然後中途崩潰,但是您需要檢查日誌以找出結果。

但是,根本原因顯然是糟糕的桌面設計,這就是解決方案所在。你得到的任何答案都可以讓你解決這個問題,只能是最好的。

最好的解決辦法是將這些數據移動到一個單獨的表格中。 「兒童節目」聽起來像一個類別,因此在許多行中重複數據。這確實應該是一個「類」表中的ID,這將防止DB不必在表上的每一行運行CONCAT,因爲你可以這樣做:

SELECT * 
     FROM main_table m 
INNER JOIN lookup_table l 
     ON l.value = m.value 
    /* and optionally */ 
INNER JOIN categories cat 
     ON l.value = cat.id 
    WHERE cat.name = 'whatever' 

我知道這是不是你可能能夠提供你在問題中提供的信息,但真正的原因是無法對嚴格標準化的數據庫進行這樣的更改比這裏的代碼更重要。如果沒有資源或政治支持以正確的方式做事,最終會產生更多像這樣的令人頭疼的事情,從長遠來看,這最終會導致更多的花費。時間與老闆也許:)