【问题标题】:MySQL multi-level parent selection/join questionMySQL多级父选择/加入问题
【发布时间】:2009-06-13 08:14:09
【问题描述】:

我有一个很简单的 MySQL 查询问题,我在深夜遇到了这个问题。我正在尝试执行一个 SELECT 来计算一组数据(订单)的实例数,并将这些实例按存在于订单本身之上几个级别的父级中的值分组。

例如:

CREATE TABLE  `so_test`.`categories` (
  `id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=572395 DEFAULT CHARSET=latin1;

CREATE TABLE  `so_test`.`product_group` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `category_id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=572395 DEFAULT CHARSET=latin1;

CREATE TABLE  `so_test`.`products` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `product_group_id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=572395 DEFAULT CHARSET=latin1;

CREATE TABLE  `so_test`.`orders` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `product_id` int(10) unsigned NOT NULL auto_increment,
  `customer_id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=572395 DEFAULT CHARSET=latin1;

我想做的是在以下方面:

SELECT count(orders.id), categoryId FROM 订单,类别 WHERE orders.customer_id in (1,2,3) GROUP BY orders.productId.productGroupId.categoryId

假设第 1 类产品有 17 个订单,第 2 类产品有 2 个订单,第 3 类产品有 214 个订单,我希望得到的是:

count(orders.id), categoryId
============================
      17              1
      2               2
      214             3

如果我尝试按 product_id 进行分组,我会很好..但是两级以上的部分让我很失望。

谢谢!

【问题讨论】:

    标签: sql syntax select


    【解决方案1】:

    只需将它们连接在一起:

    select categoryid, count(orders.id)
    from category c
    left join product_group pg on pg.category_id = c.id
    left join products on p on p.product_group_id = pg.id
    left join orders o on o.product_id = p.id
    

    对于没有订单的类别,count(orders.id) 将返回 0,而 count(*) 将返回 1 或多个,具体取决于产品组和产品的数量。

    内连接根本不会计算没有顺序的类别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 2015-02-03
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多