2011-11-24 141 views
0

这里是我的查询:与LIMIT MySQL查询,LEFT JOIN和SQL_CALC_FOUND_ROWS

SELECT * 
    FROM designs AS d 
    LEFT JOIN categories AS c 
     ON d.category = c.category 
    GROUP BY d.name ASC LIMIT 0, 10 

我想返回找到没有适当的限制条件的行数。这是我的思路:

SELECT SQL_CALC_FOUND_ROWS '0', * 
    FROM designs AS d 
    LEFT JOIN categories AS c 
     ON d.category = c.category 
    GROUP BY d.name ASC LIMIT 0, 10 
UNION 
SELECT '1', FOUND_ROWS() 

这是行不通的。我得到一个列#不匹配。我将如何修改查询的工作?

回答

0

你的第一选择,是:

SELECT '0', * 

我不知道有多少列 '*' 是(至少3,d.category,d.name,c.category),但你的第二个查询(联合之后)应该具有相同的列数。现在,您只能在第二个查询中返回两列。

我的文档中也看到了,你应该使用UNION ALL而不是UNION的,我引用:

FOUND_ROWS的值()是准确的,只有在使用UNION ALL。如果UNION没有ALL,则会发生重复删除,并且FOUND_ROWS()的值仅为近似值。

+0

是的,这是我的问题(在第二个查询中返回的列较少),但我不知道如何使列匹配或找到另一个查询解决方案,从而得到没有“限制”的所有行的计数“考虑在内。我总是可以运行2个查询,但认为可能有更优雅的方式。 – MarkL

+0

只需在第二个查询中添加更多列:SELECT'1',FOUND_ROWS(),NULL,NULL,NULL,...,NULL。另外,在我看来,最好总是定义从数据库中检索的列,而不是使用星号(*) –