2011-09-21 21 views
0

文字列をデータベースの異なるテーブルの整数列と比較する際に問題があります。整数と文字列を比較するmysql SQLクエリ

カテゴリとコンテンツとして2つのテーブルを持つデータベースを用意してください。現在、各コンテンツテキストは、コンマで区切られたコンテンツテーブルの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カウント数を示す任意のコンテンツのテキストではありません。)私は、コンテンツテーブルのcategory_idsカテゴリテーブルのIDを比較する方法の多くを試してみました

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

。しかし、1つは整数であり、他の1つは文字列です。私が試した

一つの方法は、関数をキャストが、私のデータベースを変更する方法を教えてはいけないしてください

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

。理想的には、引用と見積カテゴリのテーブルがあります。それぞれの見積もりはあなたの見積もりテーブルに1回だけ保存され、見積カテゴリテーブルにはquotid、catidのような列があります。したがって、見積もりにcat a、b、cというエントリがあった場合、見積カテゴリテーブルに3つのエントリがあります。 これで、結合やグループ購入を使って質問に答えられます。