【问题标题】:get only one row from products table for each category row with category name included对于包含类别名称的每个类别行,仅从产品表中获取一行
【发布时间】:2014-02-04 07:29:29
【问题描述】:

我有两张表产品和类别。 1类有很多产品。在索引页面上,我只想显示属于每个类别的一个最新产品。换句话说,一种产品对应一种类别。

这是我的表结构 分类表

产品表

我尝试了很多答案,但无法理解他们回答的问题。所以请推荐我查询并尽可能详细说明。

【问题讨论】:

标签: php mysql sql


【解决方案1】:

试试 SQL JOINS。像这样的——

SELECT cat.category_name,pro.sub_categories FROM Category AS cat INNER JOIN product AS pro ON cat.Id=pro.Id WHERE cat.Id=1

在执行此操作之前,请确保您的products 表中提到了category id,否则JOIN ON 条件将不起作用。

【讨论】:

  • 这会产生这个错误:""你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“=1”附近使用正确的语法“”
  • MySQL 返回一个空结果集(即零行)。 (查询耗时 0.0018 秒)
【解决方案2】:

由于 mysql 不支持窗口函数,我只能建议这样做,希望 product_table 中没有两个具有相同日期的产品。因为我没有可用的正在运行的 mysql,所以我不确定这是否有效。

select c.category_name
     , p.product_name
     , p.color
     , p.category_id
     , p.sub_categories
     , p.detail
     , p.[date]
     , p.[id]
     , p.bst_seller
     , p.size
  from products p
  join ( select category_id
              , max([date])
           from product_table
       ) d
    on p.[date] = d.[date]
  join category_table
    on p.category_id = c.[id]


旧版本 - 仅适用于 sql-server

尝试使用 row_number 窗口函数来选择每个类别的最新产品,然后加入:

with products as (
    select product_name
         , color
         , category_id
         , sub_categories
         , detail
         , [date]
         , [id]
         , bst_seller
         , size
         , ROW_NUMBER() over (partition by category_id order by date desc) as cand
      from product_table
)
select c.category_name
     , p.product_name
     , p.color
     , p.category_id
     , p.sub_categories
     , p.detail
     , p.[date]
     , p.[id]
     , p.bst_seller
     , p.size
  from products p
  join category_table c
    on p.category_id = c.id
 where p.cand = 1

【讨论】:

  • 这会生成:""您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在“with products as (select product_name , color , catego' at line 1""”附近使用此错误!
  • 哦,既然你使用了sql-server标签,我以为你使用的是sql-server。 mysql 不支持窗口化(我使用over 的部分)。
  • 那么需要进行哪些更改?
  • 我刚刚添加了一个可能适用于 mysql 的新版本,请阅读我的更新答案
【解决方案3】:

Aaaahhhhhh 经过一整天的努力,我自己搞定了 :)

SELECT category_id, product_name
FROM products
GROUP BY category_id

它会生成我想要的,如下

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多