0

我的数据库中有两个表:events_usersevents_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用于合并两个表(一个表中的少数缺失字段,我将标记为空),但是,我不知道如何对它们进行排序。我目前看到的唯一出路是使用两个不同的查询ORDER BY promoted DESC, date ASC,将结果放在两个数组中,然后将它们与 PHP 交替合并。

编辑:似乎我没有很好地解释我的目标,因为当前的两个答案并不能完全解决我的问题。

建议的查询首先给我一个类别的所有提升事件,然后是另一种类型的所有提升事件,一种类型的正常事件,最后是另一种类型的剩余事件。但是,这些也需要交替:一位用户提升,一位管理员提升,一位用户提升,一位管理员提升....当我用完管理员提升事件时,我想要一个管理员事件,一个用户事件,一个管理员事件...

4

1 回答 1

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`)

);
于 2012-11-16T15:15:49.520 回答