过滤排序后通过MySQL获取倒数第三条记录[重复]

问题描述 投票:0回答:1

我正在尝试从销售表中选择按日期排列的第三个最新商品记录

我已经为此搜索了“常规”sql。我想会是这样的

SELECT sales.DATENAME(month, DATEADD (month, @mydate-1, CAST('2008-01-01' AS datetime))), sales.itemid, sales.itemname from (select * FROM sales ORDER BY salesdate DESC LIMIT 2) AS x ORDER BY salesdate LIMIT 1 WHERE itemid = $input

不管怎样,这是我的桌子

no   salesid    itemname    itemid
----------------------------------    
1   01/02/2018      A        100  
2   01/05/2018      A        100  
3   01/04/2018      A        100  
4   01/01/2018      B        400  
5   01/01/2018      A        100  
6   01/07/2018      B        400  
7   01/07/2018      A        100  
8   01/11/2018      A        100  
9   01/09/2018      B        400  
10  01/08/2018      A        100  
11  01/08/2018      B        400  

按日期和 ID 排序后

no   salesid    itemname    itemid
----------------------------------   
5   01/01/2018      A        100  
1   01/02/2018      A        100  
3   01/04/2018      A        100  
2   01/05/2018      A        100  
7   01/07/2018      A        100  
10  01/08/2018      A        100  
8   01/11/2018      A        100

因此,如果 $input = 100,结果就是第 7 条记录

我已经尝试过:

$this->db->select('sales.DATENAME(month,DATEADD(month, @mydate-1,CAST(\'2008-01-01\' AS datetime))),sales.itemid,sales.itemname')
->from('(select * FROM sales ORDER BY salesdate DESC LIMIT 2) AS x')
->order_by('salesdate ASC')
->limit(1)
->where('itemid', '$input', FALSE)
->get();

这是我的控制器

public function result()
    {
        $data = [
            'data'=>$this->mresult->resultt()->row()
        ];
        
        $this->load->view('vresult',$data);
    }

以及我想在 vresult.php 上显示的内容

Item ID = <?= $data['itemid']; ?>
Item Name = <?= $data['itemname']; ?>
Sales Date = <?= $data['salesdate']; ?>

或者如果 $input = 100 就会像这样

Item ID = 100
Item Name = A
Sales Month = June

错误信息

Error Number: 1054

Unknown column '100' in 'where clause'

SELECT * FROM (SELECT * FROM sales ORDER BY salesdate DESC LIMIT 3) AS x WHERE salesid = 100 ORDER BY `salesdate` ASC LIMIT 1

Filename: C:/.../DB_driver.php

Line Number: 692

我使用“*”,因为显然 DATENAME 在 mysql 上不起作用。

php sql codeigniter
1个回答
0
投票

检查下面的代码,其中内部查询从 sales 中选择所有列,并根据

row number (rn)
的降序添加
salesdate
,希望它有帮助。

   $input_item_id = 100; // Item ID
    
    $query = $this->db->query("
        SELECT * FROM (
            SELECT 
                sales.salesid, 
                sales.itemname, 
                sales.itemid, 
                sales.salesdate,
                MONTHNAME(sales.salesdate) AS sales_month,
                ROW_NUMBER() OVER (ORDER BY sales.salesdate DESC) AS rn
            FROM 
                sales 
            WHERE 
                sales.itemid = $input_item_id
        ) AS subquery 
        WHERE 
            subquery.rn = 3
    ");
    
    $result = $query->row();
    
    if ($result) {
        echo "Item ID = " . $result->itemid . "<br>";
        echo "Item Name = " . $result->itemname . "<br>";
        echo "Sales Month = " . $result->sales_month . "<br>";
    }
© www.soinside.com 2019 - 2024. All rights reserved.