2011-01-31 12 views
2

私は元々私が単純なクエリであると思っていたものを脳凍結しています。複数のWHEREを持つDistinct Idを引き出すためのMySQLクエリ

私は、次のようなテーブルを持っている:

ID DETAILID NAME  
------------------------------------------------- 
1 1   Sed ut perspiciatis unde 
2 1   omnis iste natus error 
3 1   sit voluptatem accusantium 
4 1   doloremque laudantium 
5 2   totam rem aperiam 
6 2   labore et dolore 
7 3   voluptate velit esse 
8 3   occaecati cupiditate non 
9 3   culpa qui officia 
10 3   placeat facere possimus 
11 3   Nam libero tempore 

私はLIKE「%%」でNAMEフィールドを複数回検索したい(LIKEの数はランダムになります)が、私は唯一の明確なを返すようにしたいですDETAILIDここで、LIKEは、DETAILIDが同じレコード内にすべて存在します。

私は円で回ってどこにもいなくなっています。誰でも助けることができますか?

答えて

1

このクエリは、あなたのすべてのLIKE条件

SELECT DETAILID 
FROM 
(
    select DETAILID, 1 as WhichMatch 
    from tbl 
    where NAME LIKE '%a%' 
    UNION ALL 
    select DETAILID, 2 as WhichMatch 
    from tbl 
    where NAME LIKE '%b%' 
    UNION ALL 
    select DETAILID, 3 as WhichMatch 
    from tbl 
    where NAME LIKE '%c%' 
) SQ 
GROUP BY DETAILID 
HAVING COUNT(DISTINCT WhichMatch) = 3 
+0

それは異なるdetailidを与えますが、特定のdetailidについてすべてのLIKEが真でない場合でもdetailidが返されます。特定のdetailidを持つすべての名前に対してすべてのLIKEが真である場合にのみ、返されるdetailidが必要です。希望は意味をなさない。ありがとう。 – scampbell

+0

@scampbell - あなたの質問を再解釈した後に編集された回答 – RichardTheKiwi

+0

優秀、それはトリックでした!どうもありがとう。クエリの説明がありますか?私は一時テーブルが作成されていることを知っていますが、どのくらいのWhichMatch値が計算されているかわかりません。再度、感謝します。IDはあなたの答えを投票しましたが、まだ十分な担当者はいません。 – scampbell

-1

この作品ではないだろうと一致DETAILIDsを与えますか?クエリ内の代わりにOR

使用 - -

SELECT DISTINCT DETAILID 
FROM MyTable 
WHERE NAME LIKE '%something%' 
    or NAME LIKE '%sometingelse%
+0

これは、別個のDETAILIDを与えますが、特定のDETAILIDに対してすべてのLIKEが真でない場合でもDETAILIDが返されます。特定のDETAILIDを持つすべてのNAMEに対してすべてのLIKEが真である場合にのみ、返されるDETAILIDが必要です。希望は意味をなさない。ありがとう。 – scampbell

-1

まあ、他の2つの答えにあなたのコメントを読んだ後、私はあなたがこれを必要とすると信じて

SELECT DISTINCT DETAILID 
FROM MyTable 
WHERE NAME LIKE '%something%' 
    AND NAME LIKE '%someting1%' 
    AND NAME LIKE '%someting2%' 
+0

この場合、単一のレコードのNAMEにすべてのLIKEが含まれている場合にのみ、DETAILIDが返されます。同じDETAILIDを持つすべてのレコードが、そのレコードセットのどこかのすべてのLIKEを含んでいる場合、DETAILIDを返すようにします。ありがとう。 – scampbell

-1

私は思います一番簡単な解決策は、複数のクエリでそれを行うことです。 WHEREを使用して個別IDのcount()を選択し、条件なしの個別IDのcount()を選択します。 これらの2つを比較すると、「detialids」のすべての「名前」があなたの好きなものと一致するかどうかを判断するのに最適な方法になります

0

すべての「LIKE」値が見つかるため、 COUNT(*)あなたが述べたように、それはのような「ランダムな数の可能性がどのように多くの試合、およびIDあたりBY GROUP、そしてあなたが期待する数と一致する必要が...

select 
     DETAILID, 
     count(*) RecsFound 
    from 
     YourTable 
    where 
      NAME LIKE '%a%' 
     or NAME LIKE '%b%' 
     or NAME LIKE '%c%' 
     or NAME LIKE '%d%' 
    group by 
     DetailID 
    having 
     RecsFound = 4 

参照するには"修飾子とそのような音は、動的に構築されたSQLクエリになります。そのため、あなたのHAVING句の数が、あなたがテストしている項目と一致していることを確認してください。

EDIT - 改訂回答移動()IF節

select 
     DETAILID 
    from 
     YourTable 
    where 
      if(NAME LIKE '%a%', 1, 0) 
     + if(NAME LIKE '%b%', 1, 0) 
     + if(NAME LIKE '%c%', 1, 0) 
     + if(NAME LIKE '%d%', 1, 0) = 4 

は、私は、各エントリはあなたがテストした独自の要素だったマルチ漕いテーブルからそれを見ていたと思いますどこに。あなたは同じ行にあるすべての値をすべてのLIKEと一致させることを目指しています...あなたは別の答えを受け入れましたが、ここで別々のすべてのユニオンを使わずに別の選択肢があります...

さらに、 1、2、3、4、またはそれ以上のすべてのユニオンを介して、グループを持っている...レコードを一度ヒットし、4つの条件をすべて満たし、完了です。

+0

ありがとうございました。これは、動的に構築されたSQLクエリーです。あなたの例は素晴らしいですし、私の名前のいくつかは非常に似ているという事実とは別に働いていたので、複数のレコードを見つけてカウントを増やすことができます。希望は意味をなさない。 – scampbell

+0

@scampbell、あなたのコメントごとに、複雑な組合を必要としない改訂されたクエリがありますが、あなたが探していた答えがまだ得られるはずです。 – DRapp

+0

ありがとうございますが、これはうまく動作しません。私はエラーを取得します:#1054 - 'Where句'の 'LikeMatches'列が不明です。私がどこに行って、ちょうど私がLikeMatchesによって注文することができる質問を実行する場合、それは非常に奇妙なようです。しかし、たとえ私が3つのマッチで(そのコードが4つのマッチを見つけた)LikeMatchesだけを2つの同一のdetailidのために2にしても。私は別名を使用することができると知っていますが、その場合でも1つの結果には2つのLikeMatchesがあり、3つは必要ありません。 – scampbell

関連する問題