【问题标题】:MySQL filters queryMySQL过滤器查询
【发布时间】:2013-05-01 02:56:26
【问题描述】:

我得到了商品和过滤器之间的链接表,如下所示: id、good_id、filter_id。

当用户注意到复选框时,我必须向他展示所有商品,这些商品与所有这些过滤器都有链接。

我对查询的看法是: (如果用户检查了过滤器:1,2 和 3)

SELECT DISTINCT(t0.gid) 
FROM links as t0, links as t1, links as t2 
WHERE t0.filter_id=1 AND 
      t1.good_id=t0.good_id AND t1.filter_id=2 AND 
      t2.good_id=t1.good_id AND t2.filter_id=3

但是这样一来,如果检查的过滤器很多,我们就会遇到麻烦..

那么,你将如何解决这个任务?

【问题讨论】:

  • 你想避免什么样的麻烦?
  • 您是要选择与1, 2, 3所有1, 2, 3任何 相关联的商品吗?

标签: mysql search select filter


【解决方案1】:

如果您需要具有至少一个过滤器的 GID

SELECT DISTINCT `gid` FROM `links` WHERE `filter_id` IN (1,2,3)

如果您需要具有所有过滤器 1、2、3 的 GID

SELECT `gid` FROM `links` WHERE `filter_id` IN (1,2,3) 
GROUP BY `gid` HAVING COUNT( DISTINCT `filter_id`)=3  

COUNT( DISTINCTfilter_id)=3 表示所有 3 个过滤器都已打开。

【讨论】:

  • 您的查询选择了所有具有过滤器=(1 OR 2 OR 3)的gid,但不是具有所有这些过滤器的商品。
  • @Nikolay 看第二个查询。
  • 我的错误。我的表格中多了一个链接(指向类别)。因此,一种商品可以与每个过滤器关联两次或更多次。
  • @Nikolay 我已经更改了第二个查询(添加了COUNT( DISTINCT filter_id))现在它必须工作。看来您的表中具有相同 (gid,filter_id) 对的行增加了一倍。
  • 谢谢!很好,有人只是为了好玩而帮助你。
【解决方案2】:
SELECT  gid
FROM    links
WHERE   filter_id IN (1, 2, 3)
GROUP BY
        gid
HAVING  COUNT(DISTINCT filter_id) = 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 2011-08-02
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多