我的数据库中有两个表:events_users
和events_admins
。两者几乎完全相同(除少数几个领域外)。两个表都有一个promoted
字段(1或0)。
+-----------------+-----------------------+-------------------+-------------------+
| events_users_id | events_users_promoted | events_users_name | events_users_date |
+-----------------+-----------------------+-------------------+-------------------+
| 1 | 0 | Users foo | 2012-11-15 |
| 2 | 1 | Users bar | 2012-11-15 |
| 3 | 0 | Users foobar | 2012-11-14 |
+-----------------+-----------------------+-------------------+-------------------+
+------------------+------------------------+--------------------+--------------------+
| events_admins_id | events_admins_promoted | events_admins_name | events_admins_date |
+------------------+------------------------+--------------------+--------------------+
| 1 | 0 | admins foo | 2012-11-14 |
| 2 | 0 | admins bar | 2012-11-15 |
| 3 | 1 | admins foobar | 2012-11-16 |
+------------------+------------------------+--------------------+--------------------+
由于各种原因,我无法将这两种类型的事件放在一个表中。但是,我确实想要一个结果,如下所示:
所有事件按日期排序,最近一次按顺序排列,但是管理事件首先出现,并且始终与用户事件交替(交替显示每条记录)。首先显示推荐的用户和管理员事件。
+------------------+-----------------------+-------------------+-------------------+
| a 3 | 1 | admins foobar | 2012-11-16 |
| u 2 | 1 | Users bar | 2012-11-15 |
| a 1 | 0 | admins foo | 2012-11-14 |
| u 3 | 0 | Users foobar | 2012-11-14 |
| a 2 | 0 | admins bar | 2012-11-15 |
| u 1 | 0 | Users foo | 2012-11-15 |
+------------------+-----------------------+-------------------+-------------------+
我想知道我是否可以使用一个查询执行此操作,使用UNION
合并两个表(一个表中的少数缺少的字段,我将标记为null),但是,我不会知道如何对它们进行排序。我目前看到的唯一出路是使用两个不同的查询和一个简单的ORDER BY promoted DESC, date ASC
,将结果放在两个数组中并将它们与PHP交替合并。
编辑:似乎我没有充分解释我的目标,因为目前的两个答案并没有完全解决我的问题。
建议的查询首先从一个类别向我提供所有提升的事件,然后是另一个类型的所有提升事件,一种类型的正常事件以及另一种类型的剩余事件。但是,这些也需要交替:一个用户升级,一个管理员升级,一个用户升级,一个管理员升级....当我用完管理员推广活动时,我想要一个管理员事件,一个用户事件,一个管理活动......
答案 0 :(得分:1)
SELECT * FROM (
SELECT
'u' AS TYPE,
id ,
events_users_id AS events_users_id,
events_users_promoted AS promoted,
events_users_name AS name,
events_users_date AS date
FROM eventusers
UNION ALL
SELECT
'a' AS TYPE,
id,
events_admin_id AS events_admins_id,
events_admin_promoted AS promoted,
events_admin_name AS name,
events_admin_date AS date
FROM eventadmins
) AS tmp
ORDER BY ID, TYPE DESC
查看此http://www.sqlfiddle.com/#!2/5b9a5/10
两个表中都添加了一列。
CREATE TABLE `eventusers` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`events_users_id` INT(10),
`events_users_promoted` INT(10),
`events_users_name` varchar(50),
`events_users_date` date,
PRIMARY KEY (`id`)
);
CREATE TABLE `eventadmins` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`events_admin_id` INT(10),
`events_admin_promoted` INT(10),
`events_admin_name` varchar(50),
`events_admin_date` date,
PRIMARY KEY (`id`)
);