2016-05-20 14 views
0

CSV列に特定の値を持たないレコードを見つける必要があります。以下クリケット 除くテーブルiはのタグが持っている従業員の名前を見つけるために必要な構造MYSQLのCSV列の除外チェック

CREATE TABLE `employee` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(100) NOT NULL, 
    `last_name` varchar(100) NOT NULL, 
    `keywords` text, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Sample record1: 100, Sam, Thompson, "50,51,52,53" 
Sample record2: 100, Wan, Thompson, "50,52,53" 
Sample record3: 100, Kan, Thompson, "53,52,50" 

50 = sports 
51 = cricket 
52 = soccer 
53 = baseball 

「スポーツを、サッカー、野球」ので、結果として、この例では唯一の2番目と3番目のレコードを返す必要があります彼らは51(クリケット)を持っていないが、他のすべての3はdiffパターンである。

私の質問は以下ですが、それ以上はうまく機能しませんでした。

SELECT t.first_name,FROM `User` `t` WHERE (keywords like '50,52,53') LIMIT 10 

とは違うオプションがありますか?私はどのようにこれを働かせて混乱しています。

+2

コンマ区切りのアイテムとしてデータを保存しないでください。それはあなたに多くのトラブルを引き起こすだけです。 – jarlh

答えて

1

あなたはFIND_IN_SETを使用することができます。

SELECT t.first_name 
FROM `User` `t` 
WHERE FIND_IN_SET('50', `keywords`) > 0 
    AND FIND_IN_SET('52', `keywords`) > 0 
    AND FIND_IN_SET('53', `keywords`) > 0 
    AND FIND_IN_SET('51', `keywords`) = 0; 

それが遅くなる可能性に留意してください。正しい方法は、テーブル構造を正規化することです。

1

FIND_IN_SETはあなたのために仕事をしますが、はインデックスを使用しません。これはバグではなく、featureです。

SUBSTRING_INDEXは、インデックスを使用して任意のデータを返すことができます。現時点ではインデックスはありませんが、ここでキャッチするのはTEXT fields cannot be fully indexedです。あなたが持っているものはTEXTフィールドです。

ノーマライズ

これは本当にすべきことです。コンマ区切りの値をデータベースに格納することはお勧めできません。あなたは本当にキーワードテーブルを持っている必要がありますし、キーワードは短いので、完全にインデックスを付けることができるcharまたはvarcharの狭いカラムを持つことができます。

関連する問題