Php 按列对行进行排序,同时将行与公共列保持在一起 我正在运行MariaDB 5.5,它相当于MySQL 5.5。

Php 按列对行进行排序,同时将行与公共列保持在一起 我正在运行MariaDB 5.5,它相当于MySQL 5.5。,php,mysql,mariadb,innodb,Php,Mysql,Mariadb,Innodb,我有以下测试数据 CREATE TABLE `dev_test` ( `id` INT NOT NULL AUTO_INCREMENT , `date` DATE NOT NULL , `venue` INT NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB; INSERT INTO `dev_test` (`id`, `date`, `venue`) VALUES (NULL, '2019-08-01', '

我有以下测试数据

CREATE TABLE `dev_test` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `date` DATE NOT NULL , 
    `venue` INT NOT NULL , 
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

INSERT INTO `dev_test` (`id`, `date`, `venue`) VALUES (NULL, '2019-08-01', '2'),
                           (NULL, '2019-09-01', '1'), (NULL, '2019-10-01', '2');
INSERT INTO `dev_test` (`id`, `date`, `venue`) VALUES (NULL, '2019-11-01', '3');
我希望订购场地和活动,以便下一个活动的场地是第一个,然后是该场地的所有其他活动。然后列出下一个未准备就绪的事件

因此,有了这些数据,我想要:

Event ID 1 - 2019-08-01 Venue 2
Event ID 3 - 2019-10-01 Venue 2
Event ID 2 - 2019-09-01 Venue 1
Event ID 4 - 2019-11-01 Venue 3
我可以任意顺序获取所有事件,然后使用PHP对它们进行排序

或者我可以选择

SELECT venue FROM `dev_test` GROUP BY venue ORDER BY date;
然后使用PHP按日期顺序一次获取一个场地

SELECT * FROM `dev_test` WHERE venue = 2 ORDER BY date;
SELECT * FROM `dev_test` WHERE venue = 1 ORDER BY date;
但是在纯MySQL(MariaDB)中有没有一种很好的方法可以做到这一点呢?
也许可以通过某种方式为所有场馆提供一个临时日期列,该列与该场馆的最早日期相同?
还是我应该用PHP来做


为戈尔的头衔感到抱歉。我尝试使“按日期订购活动,同时将活动保持在同一位置”更通用。

您可以在下面尝试-使用
按场馆描述、日期asc订购

SELECT * FROM `dev_test` 
order by venue desc, date asc

试试这个问题,我想这对你有帮助

SELECT t2.* FROM 
(SELECT venue FROM dev_test GROUP BY venue ORDER BY date) AS t1
LEFT JOIN (SELECT * FROM dev_test ORDER BY date) AS t2 ON t1.venue=t2.venue
这里是结果


您可以将窗口函数与CTE结合使用来实现这一点(注意:需要MySQL 8+:

WITH added_initial_date 
 AS (SELECT id, 
            date, 
            venue, 
            FIRST_VALUE(date) 
              OVER( 
                PARTITION BY venue 
                ORDER BY date) AS 'initial_date' 
     FROM   dev_test), 
 ranked 
 AS (SELECT id, 
            date, 
            venue, 
            initial_date, 
            RANK() 
              OVER( 
                ORDER BY initial_date ASC) AS position 
     FROM   added_initial_date) 
SELECT id, 
   date, 
   venue 
FROM   ranked 
ORDER  BY position ASC, date ASC; 
也许它不是最有效的,但它是有效的

更新:添加了按日期排序以首先获取最接近的记录。这里是db FIDLE:

例如:

SELECT a.*
  FROM dev_test a 
  LEFT 
  JOIN (SELECT * FROM dev_test ORDER BY date DESC LIMIT 1) b 
    ON b.venue = a.venue 
 ORDER 
    BY b.id IS NULL, date DESC;

这假设日期是唯一的,根据示例数据

例如,使用多个顺序,就像他说的那样。这适用于测试数据。但是,如果切换所有场地,则会失败,因为它总是首先返回最高的场地。我在测试数据中添加了另一行,以说明为什么这不起作用。这只是按照日期顺序提供了事件。我已尝试删除“按日期排序的订单”在select as t2中,但这并没有改变任何东西。谢谢!啊,很抱歉,它显然起作用了。它在我的数据库中不起作用,所以我会看看它是否是另一个版本或其他什么。没关系。可能您的本地数据库中的数据与这里略有不同?我运行的是MariaDB 5.5,相当于MySQL 5.5。因此可能会有所不同MySQL 5.5和5.6之间的差异是错误的。这在MySQL 5.5+上非常有效。不适用于服务器版本:5.5.60-MariaDB-MariaDB服务器。如果我找到解决方案,将进行更新。@草莓可以扩展吗?日期是否唯一?@草莓唯一日期不能保证。但返回的订单重复日期无关紧要。谢谢r答案。我必须相信这对运行MySQL 8+的人是有效的。很抱歉,我最初没有在问题中包括我的DB版本。这需要哪个版本的MySQL?在MySQL 5.5或5.6@SamDean中似乎不起作用。也许规范需要澄清。扩展数据集和相应的结果m帮助。它只返回带有日期说明的行,这是因为在场馆3只有一个活动