简体   繁体   中英

MYSQL Query : How to UNION two table with ORDER BY

can anyone help me solve this problem? i've been trying to query this but i keep getting error.

MySQL code:

SELECT * FROM
(

 SELECT BU.*, BD.BOOK_TITLE AS BOOK_TITLE, BD.BOOK_COMPANY AS COMPANY,
     BD.RETURN_DATE AS RETURN 
 FROM BOOK_USER BU
 INNER JOIN BOOKING_DETAIL BD ON (BU.USR_ID = BD.USR_ID)

UNION

 SELECT BU.*, "NEW REGISTERED" AS BOOK TITLE, 'RENT-A-BOOK' AS COMPANY,
     BU.REGISTER_DATE AS RETURN 
 FROM BOOK_USER BU

) AS BU 
GROUP BY BU.USR_ID

The Tables :

BOOK_USER

+---------+----------+---------------+
| USR_ID  | USR_NAME | REGISTER_DATE |
+---------+----------+---------------+
| 1       | john     | 2011-09-20    |
+---------+----------+--------------+
| 2       | jane     | 2011-12-05    |
+---------+----------+--------------+
| 3       | doe      | 2012-02-16    |
+---------+----------+--------------+
| 4       | mary      | 2012-02-02  |
+---------+----------+--------------+

BOOKING_DETAIL

+---------+----------+------------+-----------+--------------+
| BOOK_ID  | USR_ID |  BOOK_TITLE | COMPANY   | RETURN_DATE  |
+----------+--------+-------------+-----------+--------------+
| 1       | 1       | DEAR JOHN   |ABC PVT LMT| 2011-11-01   |
+---------+---------+-------------+-----------+--------------|
| 2       | 1       | LUCKY       |  DEF      | 2012-03-18   |
+---------+---------+-------------+-----------+--------------|
| 3       | 1       | THE RISE    | GHI       | 2012-06-12   |
+---------+---------+-------------+-----------+--------------|
| 4       | 2       | HELLO       |    TIMES  | 2012-01-11   |
+---------+---------+-------------+-----------+--------------|
| 5       | 2       | SHOPAHOLIC  |           | 2012-08-31   |
+---------+---------+-------------+-----------+--------------|
| 6       | 3       | LOST        |           | 2012-06-20   |
+---------+---------+-------------+-----------+--------------|

The result should return the latest RETURN_DATE and SORTED by USR_ID.

eg:

  1. John, THE RISE, GHI,2012-06-12
  2. Jane,SHOPAHOLIC,RENT-A-BOOK,2012-08-31
  3. doe, LOST,RENT-A-BOOK,2012-06-20
  4. mary, NEW REGISTERED,RENT-A-BOOK , 2012-02-02

The query constains a subquery which gets the latest RETURN_DATE for each user.

SELECT  a.*, c.BOOK_TITLE, c.RETURN_DATE
FROM    book_user a
        INNER JOIN
        (
            SELECT usr_ID, MAX(return_DATE) maxDate
            FROM booking_detail
            GROUP BY usr_ID
        ) b ON  a.usr_ID = b.usr_ID
        INNER JOIN booking_detail c
            ON  b.usr_ID = c.usr_ID AND
                b.maxDate = c.return_DATE

UPDATE

use LEFT JOIN and COALESCE

SELECT  a.USR_ID,
        a.USR_NAME, 
        COALESCE(c.BOOK_TITLE,'RENT-A-BOOK') BOOK_TITLE, 
        COALESCE(c.RETURN_DATE, a.REGISTER_DATE) RETURN_DATE
FROM    book_user a
        LEFT JOIN
        (
            SELECT usr_ID, MAX(return_DATE) maxDate
            FROM booking_detail
            GROUP BY usr_ID
        ) b ON  a.usr_ID = b.usr_ID
        LEFT JOIN booking_detail c
            ON  b.usr_ID = c.usr_ID AND
                b.maxDate = c.return_DATE

Try that :

SELECT *
FROM (
    (
        SELECT BU.*, BD.BOOK_TITLE, BD.BOOK_COMPANY AS COMPANY,BD.RETURN_DATE AS RETURN FROM BOOK_USER BU INNER JOIN BOOKING_DETAIL BD ON (BU.USR_ID = BD.USR_ID)
    ) UNION ALL (
        SELECT BU.*, BD.BOOK_TITLE, 'RENT-A-BOOK' AS COMPANY,BD.RETURN_DATE AS RETURN FROM BOOK_USER BU INNER JOIN BOOKING_DETAIL BD ON (BU.USR_ID = BD.USR_ID)
    )
) BU
GROUP BY BU.USR_ID

You can directly get the output using following query check the query:

SELECT BU.*, IFNULL(BD.BOOK_TITLE, 'NEW REGISTERED') AS BOOK_TITLE, IFNULL(BD.BOOK_COMPANY, 'RENT-A-BOOK') AS COMPANY,BD.RETURN_DATE AS RETURN 
FROM BOOK_USER BU
LEFT JOIN (SELECT * FROM (SELECT USR_ID, BOOK_TITLE, BOOK_COMPANY, RETURN_DATE FROM BOOKING_DETAIL ORDER BY RETURN_DATE DESC) AS A GROUP BY USR_ID) AS BD ON (BU.USR_ID = BD.USR_ID) 
ORDER BY BU.USR_ID;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM