IF Условие Выполнение запроса, Другое Выполнение другого запроса - программирование
Подтвердить что ты не робот

IF Условие Выполнение запроса, Другое Выполнение другого запроса

Это кажется довольно простым во всем, кроме MySQL.

В основном мне нужно переключить какой тип индекса я использую вместе с несколькими другими условиями, основанными на том, сколько результатов возвращает определенный термин.

Что-то вроде:

IF (SELECT COUNT(*) FROM table WHERE term LIKE "term") > 4000
   EXECUTE QUERY A
ELSE
   EXECUTE QUERY B

Возможно ли это в инструкции MySQL?

EDIT:

Запрос 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;

Причиной для переключателя запросов я получаю резко разные времена результата, основанные на популярности "термина".

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ: То, что я сказал ниже о необходимости хранения хранимой процедуры, НЕ ИСТИНА. Попробуйте следующее:

SELECT CASE WHEN ( (SELECT COUNT(*) FROM table WHERE term LIKE "term") > 4000 )
    THEN <QUERY A>
    ELSE <QUERY B>
END

Это действительно выражение case, и оно отлично работает за пределами хранимой процедуры: -)

Например:

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)

Старый ответ ниже для исторического интереса, так как он уже собирает upvotes:

Вы можете использовать приведенное ниже, я думаю, но только внутри хранимой процедуры:

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!

Последнее редактирование: в любом реальном примере я, вероятно, выполнил бы условный бит в своем приложении и просто передал бы SQL (или ORM, который бы сгенерировал мой SQL), как только я решил, что искать для.

Ответ 2

Try:

select coalesce(i.id, t.id) id
from (SELECT COUNT(*) countterm FROM table WHERE term LIKE "term") c
left join
     (SELECT id, date
      FROM table_a
      FORCE INDEX(id)
      JOIN table_b ON table_a.id = table_b.id
      WHERE term LIKE "term") i on countterm > 4000
left join
     (SELECT id, date
      FROM table_a
      FORCE INDEX(term)
      JOIN table_b ON table_a.id = table_b.id
      WHERE term LIKE "term"
      GROUP BY term
      HAVING COUNT = 1) t on countterm <= 4000
ORDER BY coalesce(i.date, t.date)
LIMIT 100;