процентиль по COUNT (DISTINCT) с коррелированным WHERE работает только с представлением (или без DISTINCT)

У меня есть странный, и я не знаю, мой ли это синтаксис (который кажется простым) или ошибка (или просто не поддерживается).

Вот мой запрос, который работает, но излишне медленный:

UPDATE table1 
    SET table1column1 = 
        (SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= (SELECT table2column1 FROM table2 WHERE table2.id = table1.id) )
        / 
        (SELECT COUNT(DISTINCT table2column1) FROM table2) 

       + (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= (SELECT table2column2 FROM table2 WHERE table2.id = table1.id) ) 
        / 
        (SELECT COUNT(DISTINCT table2column2) FROM table2) 

       + (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= (SELECT table2column3 FROM table2 WHERE table2.id = table1.id) ) 
        / (SELECT COUNT(DISTINCT table2column3) FROM table2);

Это просто сумма трех процентилей (table2column1, table2column2 и table2column3) с удаленными дубликатами.

Вот где это становится странным. Я должен использовать представление для этого, чтобы работать над подзапросом сWHERE или это будет толькоUPDATE первый рядtable1и установить остальные строкиtable1column1 в0, Этоtable2view точная копияtable2, Да странно

Если я не используюDISTINCTЯ могу сделать это без зрения. Имеет ли это смысл?Примечание: я должен иметьDISTINCT потому что у меня много дубликатов.

Я пытался сделать этоSELECT только с точки зрения, но это замедлило это хуже.

Кто-нибудь знает, в чем проблема и лучший способ переработать этот запрос, чтобы он не занял так много времени? Это вTRIGGERи обновленные данные довольно по требованию.

Спасибо заранее!

подробности

Я проверяю скорость в командной строке phpMyAdmin.

Я почти уверен, что ухудшение происходит от представления, поскольку чем больше представление и чем меньше используемой таблицы, тем медленнее она получается.

Когда я делаю один безDISTINCTМолниеносно.

Работает только на просмотры?

ОК, так что я просто создал копиюtable2, Сначала я попытался выполнить исходный запрос, заменив представление копией. Нет идти

Я попытался сделать запрос ниже с копией вместо представления. Нет идти

Надеюсь, введение этих констант лучше покажет, что я пытаюсь сделать.

SET @table2column1_distinct_count = (SELECT COUNT(DISTINCT table2column1) FROM table2);
SET @table2column2_distinct_count = (SELECT COUNT(DISTINCT table2column2) FROM table2);
SET @table2column3_distinct_count = (SELECT COUNT(DISTINCT table2column3) FROM table2);
UPDATE table1, table2
    SET table1.table1column1 = (SELECT COUNT(DISTINCT table2column1) FROM  table2view WHERE table2column1 <= table2.table2column1) / @table2column1_distinct_count 
    + (SELECT COUNT(DISTINCT table2column2) FROM  table2view WHERE table2column2 <= table2.table2column2) / @table2column2_distinct_count 
    + (SELECT COUNT(DISTINCT table2column3) FROM  table2view WHERE table2column3 <= table2.table2column3) / @table2column3_distinct_count 
        WHERE table1.id = table2.id;

Опять же, когда я используюtable2 вместоtable2view, он только корректно обновляет первую строку и устанавливает все остальные строки table1.table1column1 =0.

математический

Я пытаюсь установитьtable1.table1column1 = к сумме процентилейtable2column1, table2column2, а такжеtable2column3 поid.

Я делаю процентиль (считая различные значенияtable2columnX <= к текущемуtable2columnX ) / (общее количество различныхtable2columnXс).

я используюDISTINCT избавиться от лишних дубликатов.

Посмотреть

ВотSELECT для просмотра. Это помогает?

CREATE VIEW myTable.table2view AS SELECT
    table2.table2column1 AS table2column1,
    table2.table2column2 AS table2column2,
    table2.table2column2 AS table2column3,
FROM table2
GROUP BY table2.id;

Есть ли что-то особенное вGROUP BY в представленииSELECT что делает эту работу (что я не вижу)?

Ответы на вопрос(1)

Ваш ответ на вопрос