php - 如何将两个 SQL 查询的结果合并为一个

标签 php mysql

我想合并两个复杂的查询。

第一个查询返回这些列:

BOOKID
BOOKNAME
NUM_READ
DID_I_READ_IT

第二个查询返回这些列:

BOOKID
BOOKNAME
NUM_LIKES
DID_I_LIKE_IT

我想将这些组合成一个结果,以获得所有列

BOOKID
BOOKNAME
NUM_ADDED
DID_I_ADD_IT
NUM_LIKEs
DID_I_LIKE_IT

书籍:

| ID | BOOKNAME |
|----|----------|
|  1 |    Book1 |
|  2 |    Book2 |
|  3 |    Book3 |
|  4 |    Book4 |
|  5 |    Book5 |

USERS_BOOKS:

| ID | USERID | BOOKID | STATUS |
|----|--------|--------|--------|
|  1 |    001 |      1 |   Read |
|  2 |    001 |      2 |   Read |
|  3 |    001 |      3 |  Added |
|  4 |    002 |      1 |  Added |
|  5 |    002 |      5 |  Added |
|  6 |    003 |      2 |   Read |
|  7 |    004 |      4 |   Read |

来自 this sqlfiddle我可以查询图书列表、阅读人数以及我(用户 001)是否阅读。

     SELECT a.ID, a.BOOKNAME, a.NUM_READ, 
            CASE WHEN b.BOOKID IS NULL THEN 'No' ELSE 'Yes' END AS DID_I_READ_IT
       FROM (
             select BOOKS.ID, BOOKS.BOOKNAME, 
                    SUM(CASE WHEN USERS_BOOKS.STATUS='Read' THEN 1 ELSE 0 END) AS NUM_READ
               from BOOKS
          LEFT JOIN USERS_BOOKS ON USERS_BOOKS.BOOKID = BOOKS.ID 
           GROUP BY BOOKS.ID
            ) AS a
  LEFT JOIN (
           select DISTINCT USERID, 
                           BOOKID
             FROM USERS_BOOKS
            WHERE STATUS = 'Read'
              AND USERID = '001'
            ) AS b ON a.ID = b.BOOKID

结果:

| ID | BOOKNAME| NUM_READ | DID_I_READ_IT|
|----|---------|----------|--------------|
|  1 |  BOOK1  |    1     |      Yes     |
|  2 |  BOOK2  |    2     |      Yes     |
|  3 |  BOOK3  |    0     |      No      |
|  4 |  BOOK4  |    1     |      No      |
|  5 |  BOOK5  |    0     |      No      |

还有一个表用来存储书籍的LIKES:

| ID | USERID | BOOKID | STATUS |
|----|--------|--------|--------|
|  1 |    001 |      1 |   Yes  |   //USER 001 likes BOOK 1
|  2 |    001 |      2 |   No   |   //USER 001 does not like BOOK 2
|  3 |    001 |      3 |   Yes  |
|  4 |    002 |      1 |   Yes  |   //USER 002 likes BOOK 1
|  5 |    002 |      5 |   No   |
|  6 |    003 |      2 |   Yes  |
|  7 |    004 |      4 |   No   |

来自 this sqlfiddle我可以查询图书列表、喜欢它们的人数以及我(用户 001)是否喜欢它们。

结果:

| ID | BOOKNAME| NUM_LIKES | DID_I_LIKE_IT|
|----|---------|-----------|--------------|
|  1 |  BOOK1  |     2     |      Yes     |
|  2 |  BOOK2  |     1     |      No      |
|  3 |  BOOK3  |     1     |      Yes     |
|  4 |  BOOK4  |     0     |      No      |
|  5 |  BOOK5  |     0     |      No      |

我想将这两个查询合并为一个查询,因此我想要一个图书列表、阅读它们的人数、喜欢它们的人数、我是否阅读它们以及我是否喜欢它们。

期望的结果:

| ID | BOOKNAME| NUM_READ | DID_I_READ_IT| NUM_LIKES | DID_I_LIKE_IT|
|----|---------|----------|--------------|-----------|--------------|
|  1 |  BOOK1  |    1     |      Yes     |     2     |      Yes     |
|  2 |  BOOK2  |    2     |      Yes     |     1     |      No      |
|  3 |  BOOK3  |    0     |      No      |     1     |      Yes     |
|  4 |  BOOK4  |    1     |      No      |     0     |      No      |
|  5 |  BOOK5  |    0     |      No      |     0     |      No      |

当然会有空值,例如有人喜欢一本没有人阅读或添加到他们的列表中的书,或者一本书从未被人喜欢但被很多人阅读。

最佳答案

这是使用条件聚合来制定查询的一种方法。这使用子查询来遵循原始查询的逻辑:

 SELECT b.ID, b.BOOKNAME, r.NUM_READ, 
        (CASE WHEN r.IReadItFlag > 0 THEN 'Yes' ELSE 'No' END) AS DID_I_READ_IT,
        l.NUM_LIKED,
        (CASE WHEN l.ILikedItFlag > 0 THEN 'Yes' ELSE 'No' END) AS DID_I_LIKE_IT
 FROM books b LEFT OUTER JOIN
      (SELECT ub.bookid, SUM(ub.status = 'Read') AS NUM_READ,
              SUM(ub.status = 'Read' AND ub.userid = '001') as IReadItFlag
       FROM users_books ub
       GROUP BY ub.bookid
      ) r
      on b.id = r.bookid LEFT OUTER JOIN
      (SELECT ul.bookid, SUM(ul.liked = 'Yes') AS NUM_LIKED,
              SUM(ul.liked = 'Yes' AND ul.userid = '001') as ILikedItFlag
       FROM users_likes ul
       GROUP BY ul.bookid
      ) l
      on b.id = l.bookid;

Here是 SQL fiddle 。

关于php - 如何将两个 SQL 查询的结果合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24980473/

相关文章:

php - 一起使用 COUNT 和 GROUP 时无法检索零值

php - 将 str_replace() 与从 SQL 数据库导入的字符串结合使用

javascript - 使用 html/php 编辑动态创建的结果集

timeout - 调用.php执行时间长出现 "mod_fastcgi.c.2566 unexpected end-of-file (perhaps the fastcgi process died)"如何解决?

php - cURL 和 PHP 问题

php - 为什么即使我检查数据是否存在,我的表仍然插入重复数据? PHP-MYSQL

mysql - 比较同一张表中的两个元素并返回差异/缺失数据

javascript - 具有相同提交/点击功能的 AJAX 多个表单

sql - 如何在 SQL 查询中标记重复项

php - 如何在 PHP 中正确创建自定义函数?