从两个表中选择交替记录

时间:2012-11-16 15:09:57

标签: php mysql

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

编辑:似乎我没有充分解释我的目标,因为目前的两个答案并没有完全解决我的问题。

建议的查询首先从一个类别向我提供所有提升的事件,然后是另一个类型的所有提升事件,一种类型的正常事件以及另一种类型的剩余事件。但是,这些也需要交替:一个用户升级,一个管理员升级,一个用户升级,一个管理员升级....当我用完管理员推广活动时,我想要一个管理员事件,一个用户事件,一个管理活动......

1 个答案:

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

);