mysql联合限制问题

问题描述 投票:5回答:2

我希望分页脚本基本上可以正常工作,但是情况有点复杂。我需要从两个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
mysql pagination paging union limit
2个回答
3
投票

请勿对单独的查询使用限制。仅在最后使用限制。您想从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

0
投票

旧的,但仍然有意义。

基本上,从性能角度考虑,您必须对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
© www.soinside.com 2019 - 2024. All rights reserved.