【问题标题】:SQL Complicated Group / Join by CategorySQL 复杂组/按类别加入
【发布时间】:2010-05-12 08:08:58
【问题描述】:

我目前有一个包含两个重要表的数据库结构。

1) 食物类型(水果、蔬菜、肉类)

2) 特定食物(苹果、橙子、胡萝卜、生菜、牛排、猪肉)

我目前正在尝试构建一个 SQL 语句,以便我可以拥有以下内容。

水果

蔬菜

肉类

我尝试过使用如下语句

Select * From Food_Type join (Select * From Foods) as Foods on Food_Type.Type_ID = Foods.Type_ID

但这会返回每个特定食物,而我只想要每个类别的前 2 个。所以我基本上需要我的子查询在其中包含一个限制语句,以便它只找到每个类别的前 2 个。

但是,如果我只是执行以下操作

   Select * From Food_Type join (Select * From Foods LIMIT 2) as Foods on Food_Type.Type_ID = Foods.Type_ID

我的语句总共只返回 2 个结果。

【问题讨论】:

  • 你使用的是什么数据库系统?
  • 解决此问题的查询可能依赖于特定于数据库的语法或取决于您的数据库版本支持的语法。没有多少人会想在 SQL Server 中编写查询以发现您正在使用 MySql,这就是为什么列出您正在使用的数据库很重要的原因。

标签: sql database


【解决方案1】:

回答here,但这个答案最终是特定于mysql的。

如果您的数据库更符合标准,您也可以使用PARTITION

注意:

Select * 
From Food_Type join 
     (Select * From Foods LIMIT 2) as Foods on Food_Type.Type_ID = Foods.Type_ID

(Select * From Foods LIMIT 2) 只返回整个表中的两条记录,只有在查询返回后才会进行连接。

要做你想做的事,你必须使用嵌套的子查询。

Select * 
From Food_Type join 
     Foods on Food_Type.Type_ID = Foods.Type_ID
Where Foods.Foods_ID IN (Select * 
                         From Foods AS nested 
                         Where nested.Type_ID = Food_Type.Type_ID 
                         ORDER BY ? 
                         LIMIT 2)

PARTITION/RANK 方法不同,应该更快,如果您需要帮助,请告诉我们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多