当我只想在搜索查询中获取结果数时,MySQL是否接受ORDER BY“nothing”限制“all”?

问题描述:

我已将Coldfusion的搜索移植到MySQL存储过程中。当我只想在搜索查询中获取结果数时,MySQL是否接受ORDER BY“nothing”限制“all”?

实际搜索在网站上运行两次。一次获取记录数,第二次获得实际结果显示。

因此,无论MySQL的句法中的最后两行不同:

得不到的记录:

SELECT COUNT(*) ... 
GROUP BY a, b, c 
HAVING ... 

实际结果:

SELECT "rows"... 
GROUP BY a, b, c 
HAVING ... 
ORDER BY var1, var2 
LIMIT var_start, var_end 

我的问题
因为我需要运行两次,有没有办法使用相同的存储过程=我可以添加defau lt值“ORDER BY'nothing'LIMIT'全部',以及一个参数给SELECT?

有点像if语句

WHERE 1 
AND IF(var_x = '', '.', var_x = some_value) 

感谢输入!

第一个查询是错误的 - 你不应该问MySQL的发动机实际返回的行,再算上他们,你应该问的MySQL直接算来:

SELECT COUNT(*) 
FROM ... 
GROUP BY a, b, c 
HAVING ... 

尝试shoe-horn都记录了count和记录检索在同一个SQL语句或存储过程中是不必要的优化。

+0

我在第一个查询中选择了count(*)...所以查询在SELECT和ORDER/LIMIT中有所不同。那么我应该做两个存储过滤器吗? – frequent

+0

是的,你应该做两个存储过程。 [那么我注意到,你最初在问题中所说的话并不完全正确 - 查询_does_在第一行中也有所不同......] – Alnitak

+0

是的。我现在正在编辑这个问题。好。两个存储过滤器然后:-) – frequent

为什么你不使用count(*)来使用额外的参数,如果它只是你想要的行数。

SELECT count(a) as number_of_a, count(b) as number_of b ... 
GROUP BY a, b, c 
HAVING ... 
ORDER BY var1, var2 
LIMIT var_start, var_end 
+0

嗯。我一直认为搜索需要运行两次。尝试这一点。 – frequent

+0

好的。 @Alnitak是正确的,我需要单独storedprocs。谢谢你的提示。我会记住。 – frequent

你看过sql_calc_found_rows了吗?

select sql_calc_found_rows mytable.* ... 
+0

也试过这个。 – frequent

+0

与两个存储特效一起去。谢谢你的提示。 – frequent