【问题标题】:MySQL join two separate query resultsMySQL连接两个单独的查询结果
【发布时间】:2013-12-29 03:38:50
【问题描述】:

我有两个不同的查询,例如

// This query will return past month records
SELECT b.list_id, r.name, r.city, FROM_UNIXTIME(b.bookingdate, '%Y-%m-%d- %h:%i:%s') AS 'bookingdate', COUNT(*) AS bookings
FROM booking b JOIN restaurants r ON r.list_id = b.list_id
WHERE b.bookingdate BETWEEN 1383224400 AND 1385730000 GROUP BY b.list_id

// This query will return current month records
SELECT b.list_id, r.name, r.city, FROM_UNIXTIME(b.bookingdate, '%Y-%m-%d- %h:%i:%s') AS 'bookingdate', COUNT(*) AS bookings
FROM booking b JOIN restaurants r ON r.list_id = b.list_id
WHERE b.bookingdate BETWEEN 1385816400 AND 1388408400 GROUP BY b.list_id

两个查询的结果字段 list_id、姓名、城市、预订日期、预订

我想将两个查询结果合二为一,并希望结果字段如 list_id、姓名、城市、bookingdate、bookings_lastmonth、bookings_currentmonth

最好的方法是什么?

【问题讨论】:

  • JOIN 在 SQL 中具有特殊含义,在标题中使用它会让人感到困惑。

标签: mysql


【解决方案1】:

使用UNION属性:-

SELECT b.list_id, r.name, r.city, FROM_UNIXTIME(b.bookingdate, '%Y-%m-%d- %h:%i:%s') AS 'bookingpreviousdate', '0' AS bookingnextdate, COUNT(*) AS bookings
FROM booking b JOIN restaurants r ON r.list_id = b.list_id
WHERE b.bookingdate BETWEEN 1383224400 AND 1385730000 GROUP BY b.list_id
UNION
SELECT b.list_id, r.name, r.city, '0' AS 'bookingpreviousdate', 'FROM_UNIXTIME(b.bookingdate, '%Y-%m-%d- %h:%i:%s')' AS bookingnextdate, COUNT(*) AS bookings
FROM booking b JOIN restaurants r ON r.list_id = b.list_id
WHERE b.bookingdate BETWEEN 1385816400 AND 1388408400 GROUP BY b.list_id

【讨论】:

  • 我想将两个查询结果合二为一,并希望结果字段如 list_id、name、city、bookingdate、bookings_lastmonth、bookings_currentmonth UNION 将给出 list_id、name、city、bookingdate、bookings 等相同字段的结果简而言之,我想要两个不同列中的结果字段“bookings”bookings_lastmonth、bookings_currentmonth
  • 然后再添加一列日期。
  • 'previousmonthdates' 的值不等于 0,'nextmonthdates' 的值不等于 0。
【解决方案2】:

使用union 运算符,它将两个查询放在一张表中

http://dev.mysql.com/doc/refman/5.0/en/union.html

【讨论】:

    【解决方案3】:

    我不确定预订日期

    SELECT b.list_id, r.name, r.city, FROM_UNIXTIME(b.bookingdate, '%Y-%m-%d- %h:%i:%s') AS bookingdate, 
      COUNT(b.list_id) AS bookings_lastmonth, COUNT(c.list_id) AS bookings_currentmonth
    FROM restaurants r 
    LEFT JOIN booking b ON r.list_id = b.list_id AND b.bookingdate BETWEEN 1383224400 AND 1385730000 
    LEFT JOIN booking c ON r.list_id = c.list_id AND c.bookingdate BETWEEN 1385816400 AND 1388408400
    GROUP BY r.list_id
    HAVING bookings_lastmonth>0 OR bookings_currentmonth>0
    

    【讨论】:

      【解决方案4】:

      不知何故,它通过这个查询工作

      SELECT t1.list_id, t1.name, t1.city, t1.bookings AS bookings_lastmonth, t2.bookings AS bookings_currentmonth 
      FROM   (SELECT b.list_id, r.name, r.city, FROM_UNIXTIME(b.bookingdate, '%Y-%m-%d- %h:%i:%s') AS 'bookingdate', COUNT(*) AS bookings 
              FROM   booking b JOIN restaurants r ON r.list_id = b.list_id 
              WHERE  b.bookingdate BETWEEN 1383224400 AND 1385730000 
              GROUP  BY b.list_id) AS t1
      
              JOIN (SELECT b.list_id, r.name, r.city, FROM_UNIXTIME(b.bookingdate, '%Y-%m-%d- %h:%i:%s') AS 'bookingdate', COUNT(*) AS bookings 
              FROM   booking b JOIN restaurants r 
              ON r.list_id = b.list_id 
              WHERE  b.bookingdate BETWEEN 1385816400 AND 1388408400 
              GROUP  BY b.list_id) AS t2 
      
              ON t1.list_id = t2.list_id 
      

      但我仍然需要为更多改进而努力

      【讨论】:

        猜你喜欢
        • 2011-05-16
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        相关资源
        最近更新 更多