2016-08-08 2 views
0

Я хотел бы выбрать все строки из таблицы, которые содержат 50 наиболее часто используемых значений столбца. Я попытался использовать такое объединение, но, похоже, мой выбор LEFT JOIN ошибочен. Внутренняя часть заявления кажется прекрасной. Что я должен изменить в своем заявлении?Выбор строк с наиболее частыми значениями одного столбца MySQL

SELECT col1, col2 
FROM tbl as t1 
LEFT JOIN (
    SELECT id 
    FROM tbl 
    WHERE id > 123 
     AND id < 987654 
    GROUP BY col1 
    ORDER BY COUNT(id) DESC 
    LIMIT 50 
) AS t2 
ON t1.id = t2.id 
+0

Что случилось с вашим запросом? Вы пытались изменить его на «внутреннее соединение»? – sgeddes

+0

Внутреннее соединение возвращает только 50 строк. Странно, когда я изменил лимит внутри внутреннего выбора на 5, количество возвращенных строк не изменилось. – pedmillon

+0

При использовании 'left join', результаты будут одинаковыми, некоторые из них просто будут иметь идентификатор' null' из 't2' (если вы его показывали). Возможно, образцы данных и ожидаемые результаты помогут ... – sgeddes

ответ

0

В отличие от JOIN, вы пытались использовать оператор IN как часть вашего предложения WHERE?

Например ...

SELECT col1, col2 
FROM tbl as t1 
WHERE t1.id IN (
    SELECT id 
    FROM tbl 
    WHERE id > 123 
     AND id < 987654 
    GROUP BY col1 
    ORDER BY COUNT(id) DESC 
    LIMIT 50 
) 
+0

По какой-то причине я не могу использовать LIMIT внутри предложения IN – pedmillon

0

по правому краю должен работать, если подзапрос правильно, возвращая любые совпадающие строки t1 до t2 (в отличие от всех строк t1 и t2 согласующих х или нулей):

SELECT col1, col2 
FROM tbl as t1 
RIGHT JOIN (
    SELECT id 
    FROM tbl 
    WHERE id > 123 
     AND id < 987654 
    GROUP BY col1 
    ORDER BY COUNT(id) DESC 
    LIMIT 50 
) AS t2 
ON t1.id = t2.id 
0

Я понимаю, что мой запрос был в порядке, я просто хотел присоединиться на col1, а не идентификатор :)

SELECT col1, col2 
FROM tbl as t1 
LEFT JOIN (
    SELECT col1 
    FROM tbl 
    WHERE id > 123 
    AND id < 987654 
    GROUP BY col1 
    ORDER BY COUNT(id) DESC 
    LIMIT 50 
) AS t2 
ON t1.col1 = t2.col1 
Смежные вопросы