0

次のデータをクエリしようとすると問題が発生します。

id. | name | type

 1.    bob | a 
 2.    sam | ab
 3.    jim | abc
 4.  sarah | ad
 5.   john | a
 6.    eve | bca
 7.  nikki | ca

次の入力に基づいて MySQL クエリを作成しようとしています。

a,
ac,
b*,
ac*

次の名前を返したい:

bob
john
sam
jim
eve
nikki

壊す:

a  = bob, john
ac = nikki  
b* = sam, jim, eve
ac*= jim, eve, nikki

説明:

a  = find results that are JUST a
ac = find results that contain ONLY an a AND c
b* = find results which contains a b
ac*  find results that contain at least an a and a c

ご覧のとおり、タイプ列にはさまざまな順序でタイプ情報を含めることができます (常に増加するとは限りません)。

type_aこれは、タイプ列をtype_bなどに分割してから、それぞれに a を入れることで実行できると確信していboolます。しかし、これは最大になる可能性がzあり、テーブルに26の余分な列は必要ありません!

これは単一のクエリで実行できますか?もしそうなら、助けていただければ幸いです!

なんてタイトルか分からないタイトルでごめんなさい

4

2 に答える 2

1

正規表現を使用できます:

SELECT name FROM your_table WHERE
     type RLIKE '^a+$'                            -- only 'a'
  OR type RLIKE '^((a[ac]*c)|(c[ac]*a))[ac]*$'    -- only & both 'a' AND 'c'
  OR type RLIKE 'b'                               -- at least one 'b'
  OR type RLIKE '(a.*c)|(c.*a)'                   -- at least 'a' and 'c'
;
于 2012-04-27T12:03:31.243 に答える
1
-- ac*, ac, a, b*

SELECT  *
FROM    mytable
WHERE   (
        type RLIKE 'a'
        AND type RLIKE 'c'
        )
        OR
        (
        type RLIKE 'a'
        AND type RLIKE 'c'
        AND NOT type RLIKE '[^ac]'
        )
        OR
        (
        type RLIKE 'a'
        AND NOT type RLIKE '[^a]'
        )
        OR
        (
        type RLIKE 'b'
        );

ただし、これはインデックスを使用しません。

テーブルがMyISAMの場合、次のような型を格納できます。

id   name     type
7    nikki    a c

(スペースに注意してください)FULLTEXT機能を使用します。

CREATE FULLTEXT INDEX fx_mytable_type ON mytable (type);

-- ac*
SELECT  *
FROM    mytable
WHERE   MATCH(type) AGAINST '+"a" + "c"' IN BOOLEAN MODE);


-- ac
SELECT  *
FROM    mytable
WHERE   MATCH(type) AGAINST '+"a" + "c"' IN BOOLEAN MODE);
        AND NOT TYPE RLIKE '[^ ac]' -- note the space

これが機能するように設定@@ft_min_word_len = 1します。

于 2012-04-27T12:02:39.710 に答える