【问题标题】:Order by last 3 months first, then alphabeticaly首先按最近 3 个月排序,然后按字母顺序
【发布时间】:2012-01-25 22:25:34
【问题描述】:

我被要求在网站上订购产品,首先显示过去 3 个月内的任何产品(从最近的产品开始),然后按字母顺序显示其余产品。目前该网站是按类编写的,目前产品是按添加日期排序的。为了最大程度地减少工作量,我想知道是否可以在一个 sql 查询中完成上述操作?我认为它需要 2 个单独的查询,但我不是 sql 专家,所以想知道这是否可以完成?

问候

菲尔

编辑

SELECT pr.id, pr.name AS prod_name, pr.eye_size, pr.bridge_size, pr.opt_size, pr.price, pr.range_id, pr.date_added, ra.name AS range_name
FROM oa_product AS pr, oa_brand AS br, oa_range AS ra
WHERE pr.status = 'Launched'
AND pr.brand_id = br.id
AND br.filename = 'karenmillen'
AND pr.status = 'Launched'
AND pr.range_id = ra.id
AND br.status = 'Active'
ORDER BY
CASE WHEN DATEDIFF( 'm', GETDATE(
), date_added ) <3
THEN date_added
ELSE NULL , prod_name
LIMIT 0 , 6

出现错误MySQL 服务器版本,以便在' date_added 附近使用正确的语法)

有人知道为什么吗?

【问题讨论】:

  • 我觉得自己很愚蠢。在阅读并误解了您的问题后,我添加了评论。我不知道这是否可能。但即使是这样,使用两个不同的查询代码不是更容易阅读吗?
  • 使用两个单独的查询也可能会更快,特别是如果您不需要显示“其余部分”(因为它只从第 4 页开始)。

标签: mysql sql-order-by case


【解决方案1】:

使用 MySQL 语法:

select * from Products order by DateColumn > curdate() - interval 3 month desc, ProductName;

【讨论】:

    【解决方案2】:

    您不需要两个单独的查询。您可以先创建一个对最近的产品进行排序的表达式,然后再创建一个对它们进行不同排序的表达式:

    ...
    order by
      case when ProductDate < adddate(month, -3, getdate()) then 1 else 2 end,
      case when ProductDate < adddate(month, -3, getdate()) then ProductDate else null end desc,
      case when ProductDate < adddate(month, -3, getdate()) then null else ProductName end
    

    【讨论】:

    • 第二排和第三排排的情况不需要。
    • @Thilo:是的,有。否则所有记录将按日期排序。
    【解决方案3】:

    您可以使用 CASE 语句将所有超过 3 个月的产品日期视为相同。

    伪代码(类似于 T-SQL)

    SELECT ProductName, ProductDate
    FROM   Products
    ORDER BY 
      CASE WHEN DATEDIFF ('m', GETDATE(), ProductDate) < 3 THEN ProductDate 
           ELSE NULL,
      ProductName
    

    【讨论】:

    • “ProductDate”是TIMESTAMP还是DATESTAMP有关系吗?
    • 您使用的是哪个 RDBMS?假设您使用的是 SQL Server,那么您无法确定使用 TIMESTAMP 创建记录的时间——它不编码日期或时间——它只是一个递增的数字。在我所知道的任何 RDBMS 中都没有 DATESTAMP 数据类型。
    • 刚刚签入 phpMyAdmin,类型为 DATETIME。我似乎无法使上述工作。我将在我的问题中进行编辑
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2017-03-31
    • 2014-01-10
    相关资源
    最近更新 更多