选择我没有的数据库项目

时间:2015-05-04 15:30:29

标签: php mysql subquery

这就是我在我的应用程序中列出一些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) 

但它给了我一个空洞的结果。

1 个答案:

答案 0 :(得分:0)

您的子查询中存在问题。您引用了USERS_BOOKS.BOOKID,这不在子查询的范围内。你需要做的是通过已经喜欢的书籍列表

WHERE BOOKS_NEW.ID NOT IN (SELECT BOOKID FROM USERS_LIKES WHERE USERID = ?)

然后将您的用户ID传递到此处。这应该选择用户喜欢的所有书籍,并生成主要查询可以忽略的列表。