【问题标题】:MySQL Left Join With And Condition To Same ColumnMySQL左连接和条件到同一列
【发布时间】:2016-03-17 08:25:56
【问题描述】:

我有这样的表格:

tbl_product
===========
product_id (PK)

tbl_product_attribute
=====================
pro_attr_id (PK)
pro_attr_pro_id (FK to tbl_product)
pro_attr_attr_opt_id(FK to tbl_attribute_option)

现在,我想查询 tbl_product_attribute 中具有 2 个属性的产品。

例如:

SELECT "p".* 
FROM "tbl_omx_product" "p" 
LEFT JOIN "tbl_omx_product_attribute" "proAttr" ON "proAttr".pro_attr_pro_id = p.product_id 
WHERE 
    (pro_attr_attr_opt_id LIKE '%1759%' ) AND 
    (pro_attr_attr_opt_id LIKE '%1776%' )
GROUP BY "p"."product_id";

所以我想在 tbl_omx_product_attribute 处获得正好有 2 个值的产品,即 1759 和 1776。

但除非我使用关系 OR 而不是 AND,否则上述查询不会显示任何结果。

问题是检索在 tbl_product_attribute 具有 2 个值的产品的查询是什么?谢谢

【问题讨论】:

  • 使用左连接你是否期望返回的结果集也包含空值?你能显示一个示例输出吗
  • 如果您知道两个 id,那么为什么在 where 子句中使用 LIKE。你可以使用 IN (1759,1776)
  • @Harry Nope,我只期望值 1759 和 1776 的结果。例如,产品 1 具有这两个值,但产品 2 只有 1759,而不是我想要的仅限产品 1。
  • @devpro 使用 IN 将返回与使用关系“或”相同的结果。我想要的是具有这两种价值的产品。
  • 那么您应该使用 = 而不是 LIKE 来匹配这些值。如果您不期望空行,那么为什么不使用内部联接?

标签: mysql join conditional-statements


【解决方案1】:

也许我误解了你,但如果你希望产品有两个属性选项你可以查询:

SELECT "p".* 
    FROM "tbl_omx_product" "p" 
    JOIN "tbl_omx_product_attribute" "proAttr1" 
        ON "proAttr1".pro_attr_pro_id = p.product_id 
            AND "proAttr1".pro_attr_attr_opt_id LIKE '%1759%'
    JOIN "tbl_omx_product_attribute" "proAttr2" 
        ON "proAttr2".pro_attr_pro_id = p.product_id 
             AND "proAttr2".pro_attr_attr_opt_id LIKE '%1776%'

【讨论】:

    【解决方案2】:

    获取具有两个属性的产品:

    SELECT p.* 
    FROM tbl_omx_product p 
    LEFT JOIN tbl_omx_product_attribute proAttr ON proAttr.pro_attr_pro_id = p.product_id 
    GROUP BY p.product_id
    having count(*)=2;
    

    您只需添加 where 子句即可根据所需的输出过滤数据。

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      SELECT p.* 
      FROM tbl_omx_product AS p 
      LEFT JOIN  tbl_omx_product_attribute AS proAttr ON  p.product_id = proAttr.pro_attr_pro_id
      WHERE 
          (pro_attr_attr_opt_id LIKE '%1759%' ) AND 
          (pro_attr_attr_opt_id LIKE '%1776%' )
      GROUP BY p.product_id;
      

      【讨论】:

      • 实际上这是我在我的问题上发布的查询,除非关系使用'OR'而不是'AND',否则它不起作用。
      猜你喜欢
      • 1970-01-01
      • 2019-08-08
      • 2020-11-07
      • 2015-08-21
      • 1970-01-01
      • 2013-08-23
      • 2011-04-29
      • 2016-03-10
      • 1970-01-01
      相关资源
      最近更新 更多