2017-02-26 2 views
0

可能な限り単純な形式で質問を詳しく説明します。私は電子商取引のウェブサイトを作成しており、検索結果のフィルタを設定しようとしています。この問題に遭遇するまで、すべてがうまくいっています。 IDでグループ化しようとすると、他のすべての外部キーが指定値まで失われます。グループを削除すると、それぞれに価値のある外部キーが含まれた大量の結果が得られます。 (私は各記事をそれぞれの仕様値で結合しています)。したがって、私の質問は、どのようにこれらの仕様IDのすべてをフィルタリングするのですか?複数のフィルタに関するMySQLフィルタクエリ

マイクエリ(翻訳及び単純化された)次のとおりです。しかし、私はグループを使用しない場合、私は本当に行うことはできません

select * from article 
left join article_specification on article_specification.fk_articles=article.id 
where (fk_specification_value=172 or fk_specification_value=175 or fk_specification_value=184) 
group by id order by date desc 

このクエリを実行すると、私は(によるので、グループ)1件の検索結果を取得するには、結果セットを持つものクエリでORSをANDSに変更すると、値が1つしかないので何も得られません。それが私の質問の根源です。おかげさまで、ありがとうございます。申し訳ありませんが、私の質問が少し貧しく宣告された場合。

+0

クエリで期待される出力を表示してsqlfiddleを送信してください。 –

+0

集計機能を持たないグループを使用しています そしてグループによる選択*の使用はあまり意味がありません。 あなたが選択するために必要な実際の結果とグループ全体の理由を説明してください。最終的には適切なデータサンプルを追加し、期待される結果を – scaisEdge

答えて

2

あなたがすべて仕様を満たしている記事をたい場合は、行うことができます:

select a.* 
from article a join 
    article_specification ars 
    on ars.fk_articles = a.id 
where ars.fk_specification_value in (172, 175, 184) 
group by a.id 
having count(distinct ars.fk_specification_value) = 3 
order by a.date desc; 

注意:一般的に、私はgroup byで使用select *を落胆します。この場合、a.idが(おそらく)articleの主キーであるため、大丈夫です。実際には、group byのこの使用はANSI標準でサポートされています。しかし、標準で言語を解釈するには、「機能的依存性」が何であるかを理解する必要があります。

を満たす記事がの場合は、上記のクエリをhaving句なしで使用できます。ただし、existsがより適切です。

select a.* 
from article a 
where exists (select 1 
       from article_specification ars 
       where ars.fk_articles = a.id and 
        ars.fk_specification_value in (172, 175, 184) 
      ); 
+0

これは私が欲しかったのと全く同じように動作しています。ありがとうございます。 – alps

関連する問題