Mysql group by with multiple columns with inner join

时间:2016-10-14 09:42:14

标签: mysql group-by

我有3个表,productsproductscategoriescategories

productscategories是一个多对多表,只有其他两个表的id号。

没有小组的结果如下所示:

id | Url                   | Category
-------------------------------------
1 | http://example.com/12 | hat
2 | http://example.com/12 | shoe
3 | http://example.com/13 | hat
4 | http://example.com/13 | jacket
5 | http://example.com/14 | hat
6 | http://example.com/14 | socks

现在,我想排除每个行url的行,如果它包含任何选定的类别,在这种情况下为jacketshoe

不需要的结果如下所示:

id | Url                   | Category
-------------------------------------
1 | http://example.com/12 | hat
3 | http://example.com/13 | hat
5 | http://example.com/14 | hat

因为ID为{13}的url包含jacket,我不希望它在那里。同样适用于url,其中14包含shoe

这是因为我有多个类别和多个不了解彼此的网址。

以上的sql:

SELECT * FROM products
JOIN productscategories ON products.id = productscategories.product_id
JOIN categories ON categories.id = productscategories.category_id
WHERE categories.slug NOT IN (
  'shoe',
  'jacket',
) 
GROUP BY products.image_url

想要的结果:

id | Url                   | Category
-------------------------------------
5 | http://example.com/14 | hat

如何创建一个使url知道该类别的SQL查询,如上所述?

3 个答案:

答案 0 :(得分:1)

建议1:WHERE NOT EXISTS

SELECT * FROM products
JOIN productscategories ON products.id = productscategories.product_id
JOIN categories ON categories.id = productscategories.category_id
WHERE NOT EXISTS(
      SELECT 1
      FROM products p2
      JOIN productscategories pc2 ON p2.id = pc2.product_id
      JOIN categories c2 ON c2.id = pc2.category_id
      WHERE c2.slug IN ('shoe','jacket')
      AND p2.url = products.url 
  )

建议2:OUTER JOIN

SELECT * FROM products
JOIN productscategories ON products.id = productscategories.product_id
JOIN categories ON categories.id = productscategories.category_id
LEFT OUTER JOIN products p2 ON products.url = p2.url
LEFT OUTER JOIN productscategories pc3 ON p2.id = pc2.product_id
LEFT OUTER JOIN categories c2 ON c2.id = pc2.category_id AND c2.slug IN ('shoe','jacket')
WHERE c2.id IS NULL

答案 1 :(得分:1)

SELECT * FROM products
  JOIN productscategories ON products.id = productscategories.product_id
  JOIN categories ON categories.id = productscategories.category_id
 GROUP BY products.image_url
HAVING sum( categories.slug IN('shoe','jacket') )=0

categories.slug IN('shoe','jacket') - 如果类别为set,则返回1,否则返回0。 sum() - 返回组中鞋/夹克的数量。 HAVING过滤器组中有鞋/夹克。

答案 2 :(得分:0)

试试这个:

SELECT * FROM (
SELECT * FROM products
JOIN productscategories ON products.id = productscategories.product_id
JOIN categories ON categories.id = productscategories.category_id
) AS A
LEFT JOIN 
(
SELECT Url FROM products
JOIN productscategories ON products.id = productscategories.product_id
JOIN categories ON categories.id = productscategories.category_id
WHERE Categories.slug IN ('jacket', 'shoe')
GROUP BY url
) B ON B.url = A.url
WHERE B.url IS NULL
相关问题