Sql 按子查询列值排序

Sql 按子查询列值排序,sql,subquery,Sql,Subquery,我想根据子查询表对SQL查询进行排序 表格书籍(id、姓名、作者、日期) 表用户(id、名称、已创建) 表books\u like(用户id、book\u id、日期) 我的查询用于选择每一本喜欢的书。我希望它按books_likes.date排序,而不是使用联接,而是更容易索引的子查询 第一次尝试: SELECT id FROM books WHERE id IN (SELECT book_id FROM books_likes

我想根据子查询表对SQL查询进行排序

  • 表格书籍(id、姓名、作者、日期)
  • 表用户(id、名称、已创建)
  • 表books\u like(用户id、book\u id、日期)
我的查询用于选择每一本喜欢的书。我希望它按books_likes.date排序,而不是使用联接,而是更容易索引的子查询

第一次尝试:

SELECT id 
FROM books 
WHERE id IN (SELECT book_id 
             FROM books_likes 
             WHERE user_id = 1) 
ORDER BY books_likes.date
第二次尝试:

SELECT id 
FROM books 
WHERE id IN (SELECT book_id 
             FROM books_likes 
             WHERE user_id = 1 
             ORDER BY date)

这些都不起作用。未找到该列(第一次尝试)或语法错误(第二次尝试)。

您的
WHERE in+子查询方法的问题在于,它只能限制
books
表中的记录,但不能使用
books\u likes
表中的列

我将使用联接来表达您的查询:

SELECT
    b.id
FROM books b
INNER JOIN books_likes bl
    ON b.id = bl.book_id
WHERE
    bl.user_id = 1
ORDER BY
    bl.date;
如果MySQL选择使用,以下索引可能有助于上述查询:

CREATE INDEX idx ON books_likes (user_id, book_id, date);

我认为你根本不需要加入
。你应该试试:

SELECT bl.book_id
FROM books_likes bl
WHERE bl.user_id = 1
ORDER BY bl.date;

此查询应在
图书(用户id、日期、图书id)
上使用索引,当条目过多时,索引如何使查询有效?@MarcusDrews我为您提供了一个索引选项,可能有助于您的查询。