4

次のようにデータを格納するテーブル ITEM が MySQL にあります。

ID    FEATURES
--------------------
1     AB,CD,EF,XY
2     PQ,AC,A3,B3
3     AB,CDE
4     AB1,BC3
--------------------

入力として、"AB,PQ" のような CSV 文字列を取得します。AB または PQ を含むレコードを取得したい。これを実現するには、MySQL 関数を作成する必要があることに気付きました。したがって、これを行う魔法の関数 MATCH_ANY が MySQL で定義されている場合、次のように単純に SQL を実行します。

select * from ITEM where MATCH_ANY(FEAURES, "AB,PQ") = 0

上記のクエリは、レコード 1、2、および 3 を返します。

しかし、MySQL は配列をサポートしておらず、区切り文字に基づいて文字列を分割する簡単な方法がないことに気付いたため、この関数を実装しているときにあらゆる種類の問題に遭遇しています。

テーブルの改造は、多くの問題を伴うため、私にとって最後のオプションです。

次のような複数の MATCH_ANY 関数を含むクエリを実行することもできます。

select * from ITEM where MATCH_ANY(FEATURES, "AB,PQ") = 0 and MATCH_ANY(FEATURES, "CDE")

上記の場合、レコード (1, 2, 3) と (3) の共通部分はちょうど 3 になります。

どんな助けでも大歓迎です。

ありがとう

4

5 に答える 5

8

まず第一に、データベースにはもちろんコンマ区切りの値を含めるべきではありませんが、これをすでに知っていることを願っています。テーブルが正規化されている場合、次のようなクエリを使用してアイテムを簡単に取得できます。

select distinct i.Itemid
from Item i
inner join ItemFeature f on f.ItemId = i.ItemId
where f.Feature in ('AB', 'PQ')

カンマ区切りの値の文字列を一致させることはできますが、あまり効率的ではありません。

select Id
from Item
where
  instr(concat(',', Features, ','), ',AB,') <> 0 or
  instr(concat(',', Features, ','), ',PQ,') <> 0
于 2010-05-18T12:18:45.107 に答える
5

そこにいるすべてのREGEXP愛好家のために、これを解決策として追加すると思いました:

SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]';

大文字と小文字の区別:

SELECT * FROM ITEM WHERE FEATURES REGEXP BINARY '[[:<:]]AB|PQ[[:>:]]';

2 番目のクエリの場合:

SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]' AND FEATURES REGEXP '[[:<:]]CDE[[:>:]];

乾杯!

于 2015-11-09T04:20:56.793 に答える
4
select * 
  from ITEM where 
 where CONCAT(',',FEAURES,',') LIKE '%,AB,%'
    or CONCAT(',',FEAURES,',') LIKE '%,PQ,%'

または、MATCH_ANYを実行するカスタム関数を作成します

于 2010-05-18T12:18:20.160 に答える
1

または、RLIKE() の使用を検討してください

    select * 
      from ITEM
     where ','+FEATURES+',' RLIKE ',AB,|,PQ,'; 
于 2010-05-18T12:28:24.737 に答える
0

ちょっとした考え:

SQLで実行する必要がありますか?これは、PHPやPython、またはデータベースとのインターフェースに使用している言語で通常作成することを期待できるようなものです。

このアプローチでは、SQLでプロシージャを作成するのではなく、必要な複雑なロジックを使用してクエリ文字列を作成し、バニラSQLクエリを送信するだけで済みます。

ベン

于 2010-05-18T12:07:28.550 に答える