【问题标题】:MySQL select category and subcategory if they have productsMySQL 选择类别和子类别(如果有产品)
【发布时间】:2015-09-10 06:33:15
【问题描述】:

我正在尝试进行查询以解决此问题:

如果主类别包含产品或子类别包含产品,请选择主类别

问题在于它没有选择包含产品的子类别

SELECT Category.id, Category.name, Category.description, Category.image
FROM categories_table as Category
JOIN products_table as Product
WHERE Category.subcategory = 0 AND Product.category = Category.id    
    OR Category.id IN
    (
        SELECT SubProduct.categorie
        FROM kosBonusShop_regels AS SubProduct
        WHERE SubProduct.category = Category.subcategory
            AND Product.category = Category.id   
        GROUP BY Product.category
    )
GROUP BY Product.category


Product #1                               Category #1
id             | 1                       id          |  1
category       | 2 (Pencils)             subcategory |  0 (none)
description    | Pencil                  title       |  office supplies

Category #2
id          | 2
subcategory | 1 (office supplies)
title       | Pencils

产品铅笔应属于铅笔类别,铅笔类别应属于办公用品类别的子类别

办公用品类别也可以包含产品

【问题讨论】:

  • 子类别的可能深度是多少?
  • 您应该尽量避免在FROM 子句中使用逗号。
  • 可能是您的条件没有正确布置。 AND 总是具有更高的优先级。
  • @M0rii 只是一个级别。类别 -> 子类别
  • product 怎么可能与category 有直接关系(正如Product.category 所暗示的那样)?

标签: mysql


【解决方案1】:

在使用这样的子查询时,您应该使用 IN 关键字而不是等号。此外,在您的情况下,最好使用 JOIN 。试试这个:

SELECT Category.id, Category.name, Category.description, Category.image
FROM categories_table as Category
LEFT JOIN products_table as Product ON Product.category = Category.id
WHERE (Category.subcategory = 0 AND NOT ISNULL(Product.id))
    OR Category.id IN
    (
        SELECT SubProduct.categorie
        FROM kosBonusShop_regels AS SubProduct
        WHERE SubProduct.category = Category.subcategory
            AND Product.category = Category.id   
        GROUP BY Product.category
    )
GROUP BY Product.category

【讨论】:

  • 它不能解决我的问题,但如果表结构没有子类别,这是一个很好的建议。如果主表为空且只有子类别,则此代码不会选择主表
  • 抱歉,目前无法完全测试。更正了我的答案,请检查这个版本。
  • 这不是重点。 OR 语句没有解决查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多