2017-02-26 119 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次的結果(因此GROUP BY),但是如果我不組我真的不能做任何結果集。如果我在查詢中將ORS更改爲ANDS,那麼我什麼也得不到,因爲只有1個值。這是我的問題的根源。在此先感謝,對不起,如果我的問題有點糟糕的判決。

+0

請發佈一個sqlfiddle,其中包含您希望查詢的輸出。 – 2017-02-26 19:34:54

+0

您正在使用group by by aggregation function 以及使用select * with group by沒有太大意義.. 請解釋一下您需要的真實結果,然後選擇您想要使用的group ..最終添加一個適當的數據樣本和預期的結果 – 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; 

注:一般情況下,我不鼓勵使用select *group by。在這種情況下,它可以,因爲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