0

データベースに と の 2 つのテーブルがevents_usersありevents_adminsます。この 2 つはほとんど同じです (いくつかのフィールドを除いて)。どちらのテーブルにも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         |
+------------------+------------------------+--------------------+--------------------+

さまざまな理由から、両方のタイプのイベントを 1 つのテーブルに入れることはできません。ただし、次のように 1 つの結果が必要です。

すべてのイベントは日付順に並べられ、最新のものから順に表示されますが、管理イベントが最初に表示され、常にユーザー イベントと交互に表示されます (すべてのレコードが交互に表示されます)。昇格したユーザーと管理者のイベントが最初に表示されます。

+------------------+-----------------------+-------------------+-------------------+
|              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        |
+------------------+-----------------------+-------------------+-------------------+

2 つのテーブルをマージするために使用する 1 つのクエリでこれを実行できるかどうか疑問に思っていましUNIONた (1 つのテーブルのいくつかの不足しているフィールドを null としてマークします) が、それらを並べ替える方法がわかりません。現時点で私が目にする唯一の方法は、単純な .xml で 2 つの異なるクエリを使用しORDER BY promoted DESC, date ASC、結果を 2 つの配列に入れ、それらを PHP と交互にマージすることです。

編集:現在の2つの回答では問題が正確に解決されないため、目標を十分に説明していないようです。

提案されたクエリは、最初に 1 つのカテゴリの昇格されたすべてのイベントを提供し、次に別のタイプのすべての昇格されたイベント、一方のタイプの通常のイベント、最後に他方のタイプの残りのイベントを提供します。ただし、これらも交互に行う必要があります: 1 人のユーザーが昇格し、1 人の管理者が昇格し、1 人のユーザーが昇格し、1 人の管理者が昇格します。管理者イベント...

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

両方のテーブルにもう 1 つの列が追加されました。

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 に答える