Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按日期排序的mySql查询分组不起作用_Php_Mysql_Sql - Fatal编程技术网

Php 按日期排序的mySql查询分组不起作用

Php 按日期排序的mySql查询分组不起作用,php,mysql,sql,Php,Mysql,Sql,我有两张这样的桌子 我要最新的数据 tbl_fruit_info +-----+--------+ | sId | sName | +-----+--------+ | 1 | Apple | | 2 | Banana | | 3 | Orange | +-----+--------+ tbl_fruit_data +------------+----------+-------------+ | date | fruit_id | fruit_price | +-

我有两张这样的桌子
我要最新的数据

tbl_fruit_info
+-----+--------+
| sId | sName  |
+-----+--------+
|   1 | Apple  |
|   2 | Banana |
|   3 | Orange |
+-----+--------+

tbl_fruit_data
+------------+----------+-------------+
|    date    | fruit_id | fruit_price |
+------------+----------+-------------+
| 2017-01-26 |        1 | 44.7        |
| 2017-01-27 |        1 | 51          |
| 2017-01-25 |        1 | 71.5        |
| 2017-01-21 |        2 | 44          |
| 2017-01-23 |        2 | 55          |
| 2017-01-24 |        2 | 71          |
+------------+----------+-------------+
我试过这个

                    SELECT tbl_fruit_info.*, tbl_fruit_data.*
                    FROM tbl_fruit_data 
                    LEFT JOIN 
                        tbl_fruit_info ON tbl_fruit_info.sId = tbl_fruit_data.fruit_id 
                    GROUP BY 
                        tbl_fruit_info.sId
                    ORDER BY 
                        max(tbl_fruit_data.date) DESC;
我正在寻找的输出如下所示:

+-----+--------+----------------------------+
| sId | sName  | date          |fruit_price | 
+-----+--------+----------------------------+
|   1 | Apple  | 2017-01-27    | 51         |
|   2 | Banana | 2017-01-24    | 71         |
|   3 | Orange | 0000-00-00    | 0          |
+-----+--------+----------------------------+
但我明白了:

+-----+--------+----------------------------+
| sId | sName  | date          |fruit_price | 
+-----+--------+----------------------------+
|   1 | Apple  | 2017-01-26    | 44.7       |
|   2 | Banana | 2017-01-21    | 44         |
+-----+--------+----------------------------+
如蒙协助,将不胜感激

select * from tbl_fruit_data f
    left join tbl_fruit_info i ON i.sId = f.fruit_id 
where f.Date =
    (Select max(date) from tbl_fruit_data
     where fruit_id = f.fruit_id)
更新2017-01-30:将tbl_Firuit_信息中没有对应行的行合并到tbl_Firuit_数据中,现在

create table #t1
(id int,name varchar(100));


create table #t2(
[date] date,
id int,
price float)

insert into #t1
select 1,'Apple'
union
select 2,'Banana'

insert into #t2
select getdate()-3,1,33.2
union
select getdate()-2,1,30.5
union
select getdate()-4,1,23.4
union
select getdate()-3,2,21
union
select getdate()-2,2,35
质疑

编辑:修复了,用子查询替换了CTE,感谢dadde指出MySQL不支持CTE。CTE或子查询在这里做同样的工作

好,开始

**获取水果的最新价格,添加没有价格的水果

SELECT d1.date, d1.fruit_id, d1.fruit_price, i.sId, i.sName 
FROM tbl_fruit_info i
LEFT JOIN tbl_fruit_data d1
ON d1.fruit_id = i.sId
WHERE d1.date = (SELECT MAX(d2.date) 
                FROM tbl_fruit_data d2
                WHERE d2.fruit_id = d1.fruit_id
                 )
UNION
SELECT CAST('0001-01-01' AS datetime) date, i.sId fruit_id, 0 fruit_price, i.sId, i.sName
FROM tbl_fruit_info i
WHERE i.sId NOT IN (SELECT d2.fruit_id FROM tbl_fruit_data d2)
Sql fiddle for test for the Sample data提供的问题:

使用了这些定义

CREATE TABLE tbl_fruit_info
    (`sId` int, `sName` varchar(6))
;

INSERT INTO tbl_fruit_info
    (`sId`, `sName`)
VALUES
    (1, 'Apple'),
    (2, 'Banana'),
    (3, 'Orange')
;


CREATE TABLE tbl_fruit_data
    (`date` datetime, `fruit_id` int, `fruit_price` int)
;

INSERT INTO tbl_fruit_data
    (`date`, `fruit_id`, `fruit_price`)
VALUES
    ('2017-01-26 00:00:00', 1, 44.7),
    ('2017-01-27 00:00:00', 1, 51),
    ('2017-01-25 00:00:00', 1, 71.5),
    ('2017-01-21 00:00:00', 2, 44),
    ('2017-01-23 00:00:00', 2, 55),
    ('2017-01-24 00:00:00', 2, 71)
;
使用dadde的fiddle(做了一些调整)-并假设MySQL标记是正确的

CREATE TABLE tbl_fruit_info
    (`sId` int auto_increment PRIMARY KEY, `sName` varchar(6))
;

INSERT INTO tbl_fruit_info
    (`sId`, `sName`)
VALUES
    (1, 'Apple'),
    (2, 'Banana'),
    (3, 'Orange')
;


CREATE TABLE tbl_fruit_data
    (`date` datetime, `fruit_id` int, `fruit_price` int, primary key (fruit_id,date))
;

INSERT INTO tbl_fruit_data
    (`date`, `fruit_id`, `fruit_price`)
VALUES
    ('2017-01-26 00:00:00', 1, 44.7),
    ('2017-01-27 00:00:00', 1, 51),
    ('2017-01-25 00:00:00', 1, 71.5),
    ('2017-01-21 00:00:00', 2, 44),
    ('2017-01-23 00:00:00', 2, 55),
    ('2017-01-24 00:00:00', 2, 71)
;

SELECT a.sid
     , a.sname
     , COALESCE(b.date,'0000-00-00') date
     , COALESCE(b.fruit_price,0) fruit_price 
  FROM tbl_fruit_info a 
  LEFT 
  JOIN 
     ( SELECT x.* 
         FROM tbl_fruit_data x 
         JOIN 
            ( SELECT fruit_id, MAX(date) date 
         FROM tbl_fruit_data 
        GROUP 
           BY fruit_id
     ) y 
    ON y.fruit_id = x.fruit_id 
   AND y.date = x.date) b 
    ON b.fruit_id = a.sid;
+-----+--------+---------------------+-------------+
| sid | sname  | date                | fruit_price |
+-----+--------+---------------------+-------------+
|   1 | Apple  | 2017-01-27 00:00:00 |          51 |
|   2 | Banana | 2017-01-24 00:00:00 |          71 |
|   3 | Orange | 0000-00-00          |           0 |
+-----+--------+---------------------+-------------+

您正在查找最大值或最小值。请确认frstI需要最新的数据。请相应地编辑您的问题。您忘记了max(date*)*中的结束语。这不是tsql吗?是的,它是T-SQL,但想法保持不变。在内部查询中执行分组并与主表联接,以从其他表中获取所需的详细信息。tsql是否没有十进制数据类型您做得非常好。实际上,我想要所有不在数据表中的水果价格。你是什么意思?请注意,RDBMS中的所有表都应该有一个主键。每个表都缺少一个主键。仅此而已,还不止这些。这会影响你答案的正确性。在你的回答中有一个默认的假设,即一个表中的水果和另一个表中的水果和日期是唯一的。你应该在数据模型中明确这个隐含的假设。它工作得很好,但我也需要tbl_fruit_信息的所有元素。请考虑我想要的输出表!答案已更新。您可能需要稍微调整缺失值的顺序和显示,以满足您的要求。@AsimKrishnaDas如果这个“效果很好”,那么您一定是错误地标记了问题。因为这不是MySQL,所以查询中有什么不适用于MySQL?
CREATE TABLE tbl_fruit_info
    (`sId` int, `sName` varchar(6))
;

INSERT INTO tbl_fruit_info
    (`sId`, `sName`)
VALUES
    (1, 'Apple'),
    (2, 'Banana'),
    (3, 'Orange')
;


CREATE TABLE tbl_fruit_data
    (`date` datetime, `fruit_id` int, `fruit_price` int)
;

INSERT INTO tbl_fruit_data
    (`date`, `fruit_id`, `fruit_price`)
VALUES
    ('2017-01-26 00:00:00', 1, 44.7),
    ('2017-01-27 00:00:00', 1, 51),
    ('2017-01-25 00:00:00', 1, 71.5),
    ('2017-01-21 00:00:00', 2, 44),
    ('2017-01-23 00:00:00', 2, 55),
    ('2017-01-24 00:00:00', 2, 71)
;
CREATE TABLE tbl_fruit_info
    (`sId` int auto_increment PRIMARY KEY, `sName` varchar(6))
;

INSERT INTO tbl_fruit_info
    (`sId`, `sName`)
VALUES
    (1, 'Apple'),
    (2, 'Banana'),
    (3, 'Orange')
;


CREATE TABLE tbl_fruit_data
    (`date` datetime, `fruit_id` int, `fruit_price` int, primary key (fruit_id,date))
;

INSERT INTO tbl_fruit_data
    (`date`, `fruit_id`, `fruit_price`)
VALUES
    ('2017-01-26 00:00:00', 1, 44.7),
    ('2017-01-27 00:00:00', 1, 51),
    ('2017-01-25 00:00:00', 1, 71.5),
    ('2017-01-21 00:00:00', 2, 44),
    ('2017-01-23 00:00:00', 2, 55),
    ('2017-01-24 00:00:00', 2, 71)
;

SELECT a.sid
     , a.sname
     , COALESCE(b.date,'0000-00-00') date
     , COALESCE(b.fruit_price,0) fruit_price 
  FROM tbl_fruit_info a 
  LEFT 
  JOIN 
     ( SELECT x.* 
         FROM tbl_fruit_data x 
         JOIN 
            ( SELECT fruit_id, MAX(date) date 
         FROM tbl_fruit_data 
        GROUP 
           BY fruit_id
     ) y 
    ON y.fruit_id = x.fruit_id 
   AND y.date = x.date) b 
    ON b.fruit_id = a.sid;
+-----+--------+---------------------+-------------+
| sid | sname  | date                | fruit_price |
+-----+--------+---------------------+-------------+
|   1 | Apple  | 2017-01-27 00:00:00 |          51 |
|   2 | Banana | 2017-01-24 00:00:00 |          71 |
|   3 | Orange | 0000-00-00          |           0 |
+-----+--------+---------------------+-------------+