2011-09-21 85 views
0

我有一個字符串與數據庫中不同表的整數列進行比較的問題。mysql SQL查詢來比較整數和字符串

擁有一個包含兩個表格作爲類別和內容的數據庫。現在,每個內容文本都可以屬於多個類別,該類別列在用逗號分隔的內容表的category_ids列中。我知道這是不正常的。但它已經在那裏。

類別表

id | name | timestamp 
1 aaa something 
2 bbb something 
3 ccc something 
4 ddd something 
5 eee something 

內容表

id | category_ids | content | timestamp 
1  1    xxx  something 
2  1,2,3,4  yyy  something 
3  1,2   zzz  something 
4  1,2,3   www  something 

現在我必須展示在每個類別內容的文本數類別列表。 意味着使用該類別的內容文本的數量。注(類EEE是不是有在這麼顯示的結果集0計數的任何內容文本。)

aaa(4) 
bbb(3) 
ccc(2) 
ddd(1) 
eee(0) 

我試過的方法來分類表的ID進行比較,以內容表的category_ids很多。但一個是整數,另一個是字符串。

一個辦法我試過被投功能,但未能

SELECT C.id , C.Name, COUNT(*) AS ContentCount FROM categories AS C LEFT JOIN content AS Q ON (CAST(C.id AS CHAR) = (Q.category_ids)) GROUP BY C.Name 

請不要告訴我的方法來更改數據庫。如果有任何想法,我怎麼能寫一個查詢,這將給我這種結果集將不勝感激。

+2

數據庫中的CSV是邪惡的,您已被咬傷。 – Johan

回答

2

數據庫中的CSV是有史以來最糟糕的想法。
它會殺死任何使用索引的機會。它沒有正常化。這很慢。
它會一直咬你一次又一次。

SELECT C.id , C.Name, COUNT(*) AS QuotesCount 
FROM categories AS C 
LEFT JOIN quotes AS Q ON (FIND_IN_SET(c.id,Q.category_ids)) 
GROUP BY C.Name 

參見:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

+0

我知道它沒有正常化,但無論如何感謝您的幫助。它爲我工作。 – Astha

1

你不需要正常化您的報價表。理想情況下,你應該有一個報價和一個報價類別表。每個報價僅在報價表中存儲一次,報價類別表中有類似quotid,catid的列,因此如果報價在cat a,b,c中有條目,則報價類別表中會有三個條目。 然後,您可以使用連接和組購買來回答您的問題