Php 如何将两个SQL查询的结果合并为一个
我想合并两个复杂的查询 第一个查询返回以下列:Php 如何将两个SQL查询的结果合并为一个,php,mysql,Php,Mysql,我想合并两个复杂的查询 第一个查询返回以下列: BOOKID BOOKNAME NUM_READ DID_I_READ_IT BOOKID BOOKNAME NUM_LIKES DID_I_LIKE_IT 第二个查询返回以下列: BOOKID BOOKNAME NUM_READ DID_I_READ_IT BOOKID BOOKNAME NUM_LIKES DID_I_LIKE_IT 我想将这些合并到一个结果中,以得到所有列 BOOKID BOOKNAME NUM_ADDED DID_I
BOOKID
BOOKNAME
NUM_READ
DID_I_READ_IT
BOOKID
BOOKNAME
NUM_LIKES
DID_I_LIKE_IT
第二个查询返回以下列:
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 |
书籍使用者:
| 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 |
从中,我可以查询书籍列表、阅读人数以及我(用户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 |
| 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 | 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 |
从中,我可以查询书籍列表、喜欢它们的人数以及我(用户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 |
| 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 |
我想将这两个查询合并为一个,所以我想要一个图书列表,阅读它们的人数,喜欢它们的人数,我是否阅读它们,我是否喜欢它们
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| 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;
是SQL小提琴。但是有两个人读了第一本书。我是他们中的一员!?!否则,喜欢的数量就没有意义了。你怎么能不喜欢一本你没读过的书呢(除非是杰弗里·阿彻写的书)!?!?用户2阅读第5本书。这是怎么回事?看看我的小提琴。注意:我的模式和数据集与您的略有不同。。。这段代码要简单得多,但如果它和Gordon'sHi Gordon的一样好,我需要尝试一下。第一个查询没有得到我想要的结果,第二个查询由于错误而无法运行。@erdomester。第一个版本有什么问题?以下是两个表:。有时甚至你的第一个代码都不会运行,但是类似的列在哪里呢?谢谢Gordon,干得好!这个代码非常复杂,但再次感谢