Есть ли способ получить значения 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
Не знаете, как вы хотите, чтобы ваши конечные данные были выведены, но если вы хотите избежать нескольких операторов SQL, вы можете сделать что-то вроде этого:
SELECT
ARRAY(SELECT DISTINCT(col1) FROM MyTable) AS col1_values,
ARRAY(SELECT DISTINCT(col2) FROM MyTable) AS col2_values
Это даст вам одну строку со всеми значениями DISTINCT для каждого указанного вами "colX". Просто добавьте все дополнительные столбцы, которые вы хотите включить. Значения DISTINCT в каждом столбце будут возвращены в виде массива.
Производительность по-прежнему будет вонючей, поскольку я не думаю, что вы можете избежать выполнения нескольких отдельных операций DISTINCT.
Позвольте мне знать, что вы ищете.
Вы можете сделать это:
@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
Пожалуйста, попробуйте провести сравнительный анализ перед его внедрением в производство.