Выбор отличительных значений в каждом столбце

0

Есть ли способ получить значения Distinct из каждого столбца в базе данных MYSQL без необходимости делать многопозиционные SELECT DISTINCT для каждого столбца?

Прямо сейчас в контроллере rails я использую .pluck() для запуска:

@first = User.distinct.pluck(:first_name)
@last = User.distinct.pluck(:last_name)
@city = User.distinct.pluck(:city)
@state = User.distinct.pluck(:state)
@age = User.distinct.pluck(:age)

@info = {
        'first' => @first,
        'last' => @last,
        'city' => @city,
        'state' => @state,
        'age' => @age
    }

respond_with @info

Что создает объект с моими двумя уникальными массивами в нем, однако это занимает около 7,7 секунд (у моей таблицы 3,2 миллиона заполненных строк) и выполняется два отдельных SQL-запроса.

Я пробовал этот метод, но это дает мне массив каждого уникального COMBINATION:

@info = User.distinct.select(:first_name, :last_name, :city, :state, :age)

respond_with @info

2 ответа

2

Не знаете, как вы хотите, чтобы ваши конечные данные были выведены, но если вы хотите избежать нескольких операторов SQL, вы можете сделать что-то вроде этого:

SELECT 
ARRAY(SELECT DISTINCT(col1) FROM MyTable) AS col1_values,
ARRAY(SELECT DISTINCT(col2) FROM MyTable) AS col2_values

Это даст вам одну строку со всеми значениями DISTINCT для каждого указанного вами "colX". Просто добавьте все дополнительные столбцы, которые вы хотите включить. Значения DISTINCT в каждом столбце будут возвращены в виде массива.

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

Позвольте мне знать, что вы ищете.

0

Вы можете сделать это:

@info = User.distinct.select(:first_name, :last_name, :city, :state, :age)
@first, @last, @city, @state, @age = [], [], [], [], []
@info.map{ |i| @first<<i[0]; @last<<i[1]; @city<<i[2]; @state<<i[3], @age<<i[4] }
@info = { 'first' => @first,
          'last' => @last,
          'city' => @city,
          'state' => @state,
          'age' => @age }
respond_with @info

Пожалуйста, попробуйте провести сравнительный анализ перед его внедрением в производство.

  • 0
    Я, вероятно, вытесню это, потому что запуск только первой строки занимает чуть более 40 секунд для обработки (я пытался использовать .select () и .pluck () с одинаковым временем выполнения)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню