在MySQL以外的任何事物中,它感觉都非常简单。
基本上,我需要根据一个特定术语返回多少结果来切换我正在使用的索引类型以及其他一些条件。
效果:
IF (SELECT COUNT(*) FROM table WHERE term LIKE "term") > 4000 EXECUTE QUERY A ELSE EXECUTE QUERY B
MySQL语句中可能吗?
编辑:
查询A:
SELECT id FROM table_a FORCE INDEX(id) JOIN table_b ON table_a.id = table_b.id WHERE term LIKE "term" ORDER BY date LIMIT 100;
查询B:
SELECT id FROM table_a FORCE INDEX(term) JOIN table_b ON table_a.id = table_b.id WHERE term LIKE "term" GROUP BY term # These lines would be included for a few conditions not mentioned above.. but are necessary HAVING COUNT = 1 # same... ORDER BY date LIMIT 100;
查询切换的原因是,根据“术语”的流行程度,我得到的结果时间截然不同。
编辑: 我下面说的关于要求存储过程的说法是不正确的。尝试这个:
SELECT CASE WHEN ( (SELECT COUNT(*) FROM table WHERE term LIKE "term") > 4000 ) THEN <QUERY A> ELSE <QUERY B> END
确实,这是一个case表达式,在存储的proc外部也可以正常工作:-)
例如:
mysql> SELECT CASE WHEN ( 5 > 4 ) THEN ( SELECT 'foo' ) ELSE ( SELECT 'bar' ) END; +---------------------------------------------------------------------+ | CASE WHEN ( 5 > 4 ) THEN ( SELECT 'foo' ) ELSE ( SELECT 'bar' ) END | +---------------------------------------------------------------------+ | foo | +---------------------------------------------------------------------+ 1 row in set (0.01 sec) mysql> SELECT CASE WHEN ( 3 > 4 ) THEN ( SELECT 'foo' ) ELSE ( SELECT 'bar' ) END; +---------------------------------------------------------------------+ | CASE WHEN ( 3 > 4 ) THEN ( SELECT 'foo' ) ELSE ( SELECT 'bar' ) END | +---------------------------------------------------------------------+ | bar | +---------------------------------------------------------------------+ 1 row in set (0.00 sec)
以下是历史关注的旧答案,因为它已经获得了好评:
我认为可以使用以下内容,但只能在存储过程中使用:
CASE (SELECT COUNT(*) FROM table WHERE term LIKE "term") > 4000 WHEN 1 THEN <QUERY A> ELSE <QUERY B> END CASE
这是一条CASE语句,与CASE表达式不同… https://dev.mysql.com/doc/refman/5.0/en/case.html具有更多详细信息。
CASE
实际上,实际上,我怀疑如果您想有条件地执行不同的查询,您将需要考虑存储过程-我可能是错的,但这是我的直觉。如果可以的话,可能是CASE表达式!
最后的编辑:在任何现实世界的示例中,我可能会在应用程序中做条件位处理,一旦我决定要搜索什么,就移交给SQL(或交给生成我的SQL的ORM)。