如何将SELECT转换为SELECT JOIN?

时间:2018-05-04 22:06:48

标签: php mysql sql select join

我正在尝试将我的SELECT查询转换为SELECT的更快版本,包括JOIN,我在网上找到了。{/ p>

这是我的代码:

$stmt->prepare("SELECT * FROM books WHERE person_id = :person_id ORDER BY id DESC LIMIT 5, 10");

转换为

SELECT  l.id, value, LENGTH(stuffing) AS len
FROM    (
        SELECT  id
        FROM    t_limit
        ORDER BY
                id
        LIMIT 150000, 10
        ) o
JOIN    t_limit l
ON      l.id = o.id
ORDER BY
        l.id

我找到了代码online(最后一段代码)。它应该在执行OFFSETLIMIT时提高性能。无论如何......这是我试过

$stmt->prepare("SELECT * FROM (SELECT id FROM books WHERE person_id = :person_id ORDER BY id DESC LIMIT 5, 10) o WHERE person_id = :person_id JOIN books l ON l.id = o.id ORDER BY l.id");

但它似乎不起作用。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

  

我在网上找到了代码。在做OFFSET和LIMIT时,它应该有助于提高性能。

你在哪里听到的?您引用的声明似乎非常特定于特定的数据库架构,并不适用于您的情况。算了吧。

目前,您当前使用的SQL语句已经是最佳的。如果效果不佳,您可能需要在books (person_id, id)上创建索引。

答案 1 :(得分:1)

以下是两篇描述搜寻方法的文章:

https://blog.jooq.org/2013/10/26/faster-sql-paging-with-jooq-using-the-seek-method/

https://use-the-index-luke.com/sql/partial-results/fetch-next-page

它看起来更适合你正在做的事情。我仍然冒昧地猜测这是一个索引问题,解释会有所帮助。

答案 2 :(得分:-2)

如果有人想知道,我修好了。我将WHERE子句放在错误的位置。

这是现在的固定版本:

$stmt->prepare("SELECT * FROM (SELECT id FROM books WHERE person_id = :person_id ORDER BY id DESC LIMIT 5, 10) o JOIN books l ON l.id = o.id WHERE person_id = :person_id ORDER BY l.id");