Снова использовать статистическое значение функции в запросе - PullRequest
0 голосов
/ 31 мая 2019

Я бы хотел использовать значение count () в том же запросе внутри самой большой ().Есть ли способ сделать это?

Я пытался считать (id) как my_count, наибольшее (my_count, 7), но выдает ошибку:
ERROR 1054 (42S22): Unknown column 'my_count' in 'field list'

Если я используюgreatest(count(id), 7) увеличит ли это время запроса?
Также я могу сделать то же самое в JPA @Query?

1 Ответ

1 голос
/ 31 мая 2019

Вы не можете использовать псевдонимы из SELECT в том же SELECT, псевдонимы из SELECT подзапроса могут использоваться во внешнем запросе. Я не уверен, оптимизирует ли MySQL несколько идентичных выражений COUNT за один выбор, но я бы на это надеялся.

Когда меня по-настоящему беспокоило то, что одно и то же выражение нужно дважды, и возможные последствия для производительности его повторения (или, чаще, влияния на читаемость / поддержание устойчивости повторяющихся длинных выражений), я обнаружил, что поворот " main "запрос в подзапрос, и использование псевдонима несколько раз в запросе переноса, чтобы быть полезным.

В общем виде, как-то так

SELECT stuff, long_equation AS r1, long_equation_with_extra_operations AS r2 FROM tables

становится

SELECT mainQ.*, r1_with_extra_operations AS r2
FROM (SELECT stuff, long_equation AS r1 FROM tables) AS mainQ

В конкретном случае этого вопроса, применение вышеупомянутой тактики будет следующим:

SELECT my_count, GREATEST(my_count, 7) 
FROM (SELECT COUNT(*) AS my_count ....) AS mainQ

Примечание: подзапрос, очевидно, должен будет включать в себя любые поля, используемые в части «дополнительные операции», поэтому в зависимости от специфики исходного запроса эта тактика не всегда возможна или, по крайней мере, может быть не столь простой в использовании.

(GREATEST в выражении SELECT должно оказывать очень незначительное влияние на производительность; это эквивалентно CASE WHEN a IS NULL OR b IS NULL THEN NULL WHEN a > b THEN a ELSE b END. Однако использование его в предложении WHERE или ON может значительно снизить производительность, поскольку MySQL не может использовать преимущества индексы на полях в таких случаях.

...