Есть ли способ упростить этот запрос? - PullRequest
0 голосов
/ 17 ноября 2018

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

SELECT
    artistID, bio
FROM
    UserReactionToArtistView
WHERE
    genre = 'classical' AND type = 'like' AND bio LIKE '%Rerum%'
GROUP BY
    artistID
HAVING
    COUNT(*) = ( SELECT MAX(num) as max
                 FROM 
                   (
                     SELECT
                         artistID, bio, count(*) as num
                     FROM
                         UserReactionToArtistView
                     WHERE
                         genre = 'classical' and type = 'like' AND bio LIKE '%Rerum%'
                     GROUP BY
                         artistID ) as Artists
                    )

Извините, если это плохо отформатировано или нет место, чтобы спросить.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018
SELECT
    artistID, bio
FROM
    UserReactionToArtistView
WHERE
    genre = 'classical' AND type = 'like' AND bio LIKE '%Rerum%'
GROUP BY artistID
ORDER BY COUNT(*) DESC
LIMIT 1

Мне кажется, это ваше намерение, хотя это не совсем один и тот же запрос, я думаю, что может быть более 1 результата с одним и тем же COUNT(*).

В случае, если вы ожидаете несколько результатов, вы можете просто удалить LIMIT и выбрать COUNT(*), а затем повторять результаты до тех пор, пока COUNT(*) не изменится.

В любом случае это должно быть дешевле, чем мерзость запроса.

0 голосов
/ 17 ноября 2018

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

SELECT
    Artists.artistID,
    Artists.bioo
FROM 
    (
        SELECT
            artistID,
            -- Next line can be replaced by ANY_VALUE(bio) on newer versions of MySQL.
            MAX(bio) AS bioo,
            count(*) AS num
        FROM
            UserReactionToArtistView
        WHERE
            genre = 'classical'
        AND
            type = 'like'
        AND
            bio LIKE '%Rerum%'
        GROUP BY
            artistID ) AS Artists
WHERE
    Artists.num = (SELECT MAX(num) FROM Artists);
...