这就是我在我的应用程序中列出一些BOOK的方法:
$sessionid = '000000000015';
$stmt = $conn->prepare("
SELECT
BOOKS_NEW.ID AS BOOKID,
BOOKS_NEW.BOOK_NAME,
MAX(USERS_BOOKS.DATE_MODIFIED) AS MAXDATE,
CASE WHEN ? IN (SELECT USERID FROM USERS_LIKES WHERE BOOKID = BOOKS_NEW.ID) THEN 'Yes' ELSE 'No' END AS DID_I_LIKE_IT
FROM
USERS_BOOKS
INNER JOIN
BOOKS_NEW ON BOOKS_NEW.ID=USERS_BOOKS.BOOKID
GROUP BY
USERS_BOOKS.BOOKID
ORDER BY
MAXDATE DESC LIMIT $start, $finish");
$stmt -> execute(array($sessionid));
[[{“BOOKID”:“000000067”,“BOOK_NAME”:“查找四叶草”,“MAXDATE”:“2015-05-04 15:18:25”,“DID_I_LIKE_IT”:“否” },{“BOOKID”:“000000999”,“BOOK_NAME”:“去休斯敦火箭队比赛”,“最大化”:“2015-05-04 15:18:16”,“DID_I_LIKE_IT”:“否”}, {“BOOKID”:“000001000”,“BOOK_NAME”:“去休斯敦德州人队比赛”,“最大化”:“2015-05-04 15:18:09”,“DID_I_LIKE_IT”:“否”}}] < / p>
但是,我只想列出用户($sessionid
)没有的那些BOOK。
这是我列出用户当前BOOKID的方式:
$stmt = $conn->prepare("SELECT USERS_BOOKS.BOOKID FROM USERS_BOOKS
WHERE USERS_BOOKS.USERID = ?");
$stmt -> execute(array($sessionid));
结果:
[[{ “BOOKID”: “000000001”},{ “BOOKID”: “000000003”},{ “BOOKID”: “000000999”}]]
在最终结果中,我希望得到一个类似于第一个的json,但没有BOOKID = 000000999
,因为它存在于第二个中。
我尝试使用
WHERE NOT EXISTS (SELECT ID FROM BOOKS_NEW WHERE BOOKS_NEW.ID = USERS_BOOKS.BOOKID)
但它给了我一个空洞的结果。
答案 0 :(得分:0)
您的子查询中存在问题。您引用了USERS_BOOKS.BOOKID
,这不在子查询的范围内。你需要做的是通过已经喜欢的书籍列表
WHERE BOOKS_NEW.ID NOT IN (SELECT BOOKID FROM USERS_LIKES WHERE USERID = ?)
然后将您的用户ID传递到此处。这应该选择用户喜欢的所有书籍,并生成主要查询可以忽略的列表。