SQL同列多过滤器

Posted

技术标签:

【中文标题】SQL同列多过滤器【英文标题】:SQL same column multi filter 【发布时间】:2019-10-10 15:44:07 【问题描述】:

我正在尝试查询几个表,但是为了简化它,我会使其特定于一个表。

看看表格视图,我有 attribute_id 列,每一行都有一个属性 id 和某种值。我想从整个表中选择特定于属性 id 的值。

为了更容易理解上表中的值,我想要表中的所有行,其中“attribute_id”1 的“text_value”为 02067 且“attribute_id”2 的文本值的所有行是 HEERA BROWN BASMATI RICE。我希望这两个条件都匹配一种产品。 “product_id”使一种产品独一无二

例子

从这组结果中,我希望返回所有行,其中 attribute_id 为 25 的行的 integer_value 为 11,attribute_id 为 24 的行的值为 6(目前都可以,但将来不会)条件必须匹配一个 product_id 才能返回该 product_id 行。

如果您需要更多说明,请询问谢谢。

【问题讨论】:

阅读本文。 ***.com/help/how-to-ask 【参考方案1】:

鉴于对原始问题和进一步 cmet 的编辑,我想我知道问题在问什么,但尚未得到确认。 OP 似乎要求记录相同的 'product_id' 被列为满足两组相关条件的记录,并且只有当它匹配两者时才应返回。

这可以通过将表连接到自身来完成,然后针对连接的每一侧设置标准。

在这个例子中,再次假设表的名称是'MyTable':

SELECT mt1.* FROM `MyTable` mt1
  LEFT JOIN `MyTable` mt2
  ON( (`mt`.`product_id`=`mt2`.`product_id`)
      AND (`mt1`.`id`<>`mt2`.`id`) )
WHERE (`mt1`.`attribute_id`=25)
  AND (`mt1`.`integer_value`=11)
  AND (`mt2`.`attribute_id`=24)
  AND (`mt2`.`integer_value`=6)

还有其他方法可以做到这一点 - 例如使用 IN (SELECT ...) 查询:

SELECT * FROM `MyTable` mt0
  WHERE (`product_id` IN
    (SELECT `product_id` FROM `MyTable` `mt1`
      WHERE (`mt1`.`attribute_id`=25) AND (`mt1`.`integer_value`=11) ) )
  AND  (`product_id` IN
    (SELECT `product_id` FROM `MyTable` `mt2`
      WHERE (`mt2`.`attribute_id`=24) AND (`mt2`.`integer_value`=6) ) )

【讨论】:

如果你不清楚OP想要什么,你怎么能给出答案??? @Eric - 根据他编辑过的问题和 cmets 中的信息,我推断他是在询问我的回答... @Eric - OP 提供了更多信息,但没有回答我的最后评论。怀疑他们离线并且很快我自己也会离线,我想我会留下一个替代答案,以防万一对他有帮助。 @qasiahmed - 很高兴它能帮到你!【参考方案2】:

这是一个相当基本的 JOIN - 我认为你会从阅读 SQL 以及如何构造连接中受益,因为它会给你更多的想法。

在您的示例中,如果您的表名为 MyTable,那么您将使用:

SELECT * FROM `MyTable` WHERE `attribute_id` = 1 AND `text_value`='02067'
UNION
SELECT * FROM `MyTable` WHERE `attribute_id` = 2 AND `text_value`='HEERA BROWN BASMATI RICE'

这将为您提供您所请求的属性组合的所有行。您不必使用 UNION 查询,但这样做可以让您从不同的表中选择您所要求的数据。

【讨论】:

感谢您的回复,我没有在我看到的问题中说清楚我可以使用联合,但我希望这两个条件都匹配,因此这两个条件都匹配它以返回该行产品。你明白我的意思吗 ?我会在问题中更新这个 您似乎在寻求一种从一个表中选择项目的方法,其中列中的值同时具有两个值。因为这没有任何意义,所以您需要清楚明确地定义您想要什么。或许提供一个示例结果集,指示查询应该返回什么。 还是不清楚。您是说必须将“所有行”返回到“attribute_id”的位置,然后继续给出多个值 - 每行只有一个值。 您的意思是 - 查找所有行中存在相同 product_id 条目的所有行,其中不同的条目集存在于不同的行中?

以上是关于SQL同列多过滤器的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询 - 加入多对多关系,有选择地过滤/加入

过滤 SQL 查询

Hbase 多条件查询

SQL注入测试技巧TIP:再从Mysql注入绕过过滤说起

加入和过滤一对多关系

优化使用日期进行过滤和连接的 SQL 查询