我希望分页脚本基本上可以正常工作,但是情况有点复杂。我需要从两个SQL查询的联合中选择数据。请参阅下面的查询。我有一个桌子和一个桌子。我想要的是按受欢迎程度显示所有特定类别的书。我通过加入表格书和书访来获取至少一次访问的所有书的数据。然后将其与所有书籍合并,而无需访问。一切正常,但是当我尝试进行分页时,我需要将其限制为(0,10)(10,10)(20,10)(30,10),对吗?如果该类别中有9本书可供访问,而没有访问该类别的3761本书(共3770本书),则它应列出377页,每页列出10本书。但它不会显示某些页面上的任何数据,因为它试图显示限制为3760,10的书籍,因此在并集中没有第二次查询的记录。可能我无法在这里澄清情况,但是如果您对此情况有所考虑,那么我会明白。
SELECT * FROM (
SELECT * FROM (
SELECT viewcount, b.isbn, booktitle, stock_status, price, description FROM book AS b
INNER JOIN bookvisit AS bv ON b.isbn = bv.isbn WHERE b.price <> 0 AND hcategoryid = '25'
ORDER BY viewcount DESC
LIMIT 10, 10
) AS t1
UNION
SELECT * FROM
(
SELECT viewcount, b.isbn, booktitle, stock_status, price, description FROM book AS b
LEFT JOIN bookvisit AS bv ON b.isbn = bv.isbn WHERE b.price <> 0 AND hcategoryid = '25'
AND viewcount IS NULL
ORDER BY viewcount DESC
LIMIT 10, 10
) AS t2
)
AS qry
ORDER BY viewcount DESC
LIMIT 10
请勿对单独的查询使用限制。仅在最后使用限制。您想从2个查询中获得孔结果集,然后仅显示10个结果,无论这是LIMIT 0、10还是LIMIT 3760,10
SELECT * FROM (
SELECT * FROM (
SELECT viewcount, b.isbn, booktitle, stock_status, price, description FROM book AS b
INNER JOIN bookvisit AS bv ON b.isbn = bv.isbn WHERE b.price <> 0 AND hcategoryid = '25'
ORDER BY viewcount DESC
) AS t1
UNION
SELECT * FROM
(
SELECT viewcount, b.isbn, booktitle, stock_status, price, description FROM book AS b
LEFT JOIN bookvisit AS bv ON b.isbn = bv.isbn WHERE b.price <> 0 AND hcategoryid = '25'
AND viewcount IS NULL
ORDER BY viewcount DESC
) AS t2
)
AS qry
ORDER BY viewcount DESC
LIMIT 10, 10
旧的,但仍然有意义。
基本上,从性能角度考虑,您必须对UNION涉及的每个查询都使用LIMIT,如果您知道结果集之间将没有重复,则应考虑在性能方面考虑使用UNION ALL。然后,如果需要,比如说LIMIT 100、20,则对每个查询都用120(OFFSET + LIMIT)进行LIMIT,则总是获取所需记录的两倍,但不是全部。
SELECT [fields] FROM
(
(SELECT [fields] FROM ... LIMIT 10)
UNION ALL
(SELECT [fields] FROM ... LIMIT 10)
) query
LIMIT 0, 10
第5页
SELECT [fields] FROM
(
(SELECT [fields] FROM ... LIMIT 50)
UNION ALL
(SELECT [fields] FROM ... LIMIT 50)
) query
LIMIT 40, 10