2016-12-16 43 views
0

我有一個保存在字符串中的類別列表。一個是在廣告桌上的另一個文章桌上。我需要該腳本來返回這兩個表之間的所有這些類別的組合的所有行。這兩個表MySQL - 需要在單個字符串中找到多個通配符

類別字符串:

Civic,Community,Sports,Business 

而且我的MySQL腳本

SELECT `Ad_ID`, `Ad_URL`, `Ad_Image`, `Ad_Type`, `Ad_Cities`, `Ad_Categories` 
FROM `Ad_TABLE` 

INNER JOIN `Article_TABLE` ON `Article_TABLE`.`Article_Cat` = `Ad_TABLE`.`Ad_Cat` 

WHERE Article_TABLE.Article_Cat LIKE '%Civic%' 
OR Article_TABLE.Article_Cat LIKE '%Community%' 
OR Article_TABLE.Article_Cat LIKE '%Sports%' 
OR Article_TABLE.Article_Cat LIKE '%Business%' 

AND Ad_TABLE.Ad_Cat LIKE '%Civic%' 
OR Ad_TABLE.Ad_Cat LIKE '%Community%' 
OR Ad_TABLE.Ad_Cat LIKE '%Sports%' 
OR Ad_TABLE.Ad_Cat LIKE '%Business%' 

腳本只返回了僅在這些類別中的一個記錄,但也有在多個記錄類別,我需要它來返回這些。

我怎樣才能找到它找到兩個表之間的所有匹配類別?

+1

,如果你需要做任何事情超過店面不要在數據庫中存儲的序列化數據和檢索整個事情。查找像這樣的字符串的部分是非常低效的,你應該真的把類別分解到它自己的表中,並使用'JOIN'來計算這種關係。 – Sammitch

+0

這實際上更有意義。這個網站和數據庫真的很詭異,我一直在盡我所能地處理它,而不必重寫它的大部分內容。 – arch649

+0

這是有點不清楚你在問什麼。有*問題*嗎?初看起來...... 1)在數據庫列中存儲「逗號分隔列表」是一種SQL反模式。 2)**'AND' **運算符的優先級高於**'OR' **運算符。如果您希望以不同順序評估操作,請使用括號。 3)表中實際數據的樣本,包括應返回的示例行和不應返回的行將使規範更清晰。由於現在的問題,我們只是猜測你想要達到的目標。 – spencer7593

回答

0

我懷疑你需要括號添加到WHERE子句:

SELECT `Ad_ID`, `Ad_URL`, `Ad_Image`, `Ad_Type`, `Ad_Cities`, `Ad_Categories` 
FROM `Ad_DB` 

INNER JOIN `Article_DB` ON `Article_DB`.`Article_Cat` = `Ad_DB`.`Ad_Cat` 

WHERE (Article_DB.Article_Cat LIKE '%Civic%' 
OR Article_DB.Article_Cat LIKE '%Community%' 
OR Article_DB.Article_Cat LIKE '%Sports%' 
OR Article_DB.Article_Cat LIKE '%Business%') 

AND (Ad.DB_Cat LIKE '%Civic%' 
OR Ad.DB_Cat LIKE '%Community%' 
OR Ad.DB_Cat LIKE '%Sports%' 
OR Ad.DB_Cat LIKE '%Business%') 

我不知道你究竟表如何結構,但此查詢將返回在那裏Article_DB.Article_CatAd.DB_Cat包含您的類別之一行。您可能想要重新考慮將數據存儲在這些表中的方式,以免重複數據。

+0

這樣做的總體目的是使文章類別與具有相同類別的廣告中的廣告匹配。 – arch649

0

這是一個猜測。這只是一個猜測,基於對模糊規範的可能解釋。

要「匹配」行有一個或共同

Civic,Community,Sports,Business 

與連接謂詞這樣我們可以使用查詢更多四類:

SELECT ... 
    FROM `Ad_DB`  d 
    JOIN `Article_DB` r 

     ON ( FIND_IN_SET('Civic'  ,d.ad_categories) 
      AND FIND_IN_SET('Civic'  ,r.article_cat ) 
     ) 
     OR ( FIND_IN_SET('Community' ,d.ad_categories) 
      AND FIND_IN_SET('Community' ,r.article_cat ) 
     ) 
     OR ( FIND_IN_SET('Sports'  ,d.ad_categories) 
      AND FIND_IN_SET('Sports'  ,r.article_cat ) 
     ) 
     OR ( FIND_IN_SET('Business' ,d.ad_categories) 
      AND FIND_IN_SET('Business' ,r.article_cat ) 
     ) 
    ORDER BY ... 

注意:我知道我們得到了我們所得到的結果,有時候我們得到了一個存儲逗號分隔列表的數據庫。

在列中存儲逗號分隔的列表是SQL反模式。對於任何有興趣,爲什麼它是一個反模式,我建議比爾Karwin的優秀書的第2章

https://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557

相關問題