【问题标题】:invalid records using inner join from two tables使用来自两个表的内部联接的无效记录
【发布时间】:2015-03-25 09:38:42
【问题描述】:

我有这个从 codeigniter 生成的 sql 语句

SELECT * FROM (`products`) LEFT JOIN `products_attributes` ON `products_attributes`.`product_id` = `products`.`id` WHERE `products`.`category` = '1' AND `products`.`sub_category` = '1' AND `products_attributes`.`attribute_id` = '3' AND `products_attributes`.`attribute_id` = '4' AND `products_attributes`.`attribute_id` = '5' GROUP BY `products`.`id`

我有这些表

产品: 产品属性:

我只需要获取所有属性的产品,因此如果属性为 3、4、5,我将获得产品 id = 1,如果属性为 3、4、5、6,我将不会获得产品id = 1

【问题讨论】:

  • 尝试使用products_attributes.attribute_id IN (3,4,5)

标签: php sql codeigniter codeigniter-2


【解决方案1】:

您的 sql 查询完全错误。你所做的是: 给我记录attribute_id = 3 AND attribute_id = 4 AND attribute_id = 5 AND attribute_id = 6。一行不能同时等于3和4。 您需要的东西可以通过许多不同的方式来实现。例如:

SELECT
    products.id
FROM  products

    JOIN products_attributes ON products_attributes.product_id = products.id
WHERE
    products.category = '1'
    AND `products_attributes`.`attribute_id` IN (3,4,5,6)


GROUP BY
    products.id
HAVING COUNT(DISTINCT `products_attributes`.`attribute_id`) = 4

如果你只指定 IN ... 那么它将取所有至少有 1 个这样的 attribute_id 的记录

【讨论】:

  • 您可以删除第二个WHERE 条件并用子查询替换4 以获得不同属性的总数。
  • 如果我理解正确,那么不同的值可能不同,但在这种情况下,总数可能相同。
【解决方案2】:

试试这个:

SELECT * FROM (`products`) 
LEFT JOIN `products_attributes` 
ON `products_attributes`.`product_id` = `products`.`id` 
WHERE `products`.`category` = 1 
AND `products`.`sub_category` = 1 
AND `products_attributes`.`attribute_id` IN (3, 4, 5) 
GROUP BY `products`.`id`

【讨论】:

  • 我只需要获取所有属性的产品。 IN 相当于OR 语句,而不是AND
猜你喜欢
  • 2014-03-11
  • 2016-11-25
  • 2014-05-20
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多