有没有办法从MYSQL数据库中的每一列获取Distinct值,而不必为每列执行多个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秒(我的表有320万个完全填充的行)并运行两个单独的SQL查询。
我试过这个方法,但这给了我一个每个独特组合的数组:
@info = User.distinct.select(:first_name, :last_name, :city, :state, :age)
respond_with @info
答案 0 :(得分:2)
不确定如何输出最终数据,但如果要避免多个SQL语句,可以执行以下操作:
SELECT
ARRAY(SELECT DISTINCT(col1) FROM MyTable) AS col1_values,
ARRAY(SELECT DISTINCT(col2) FROM MyTable) AS col2_values
这将为您提供一行,其中包含每个" colX"的所有DISTINCT值。你指定。只需添加您想要包含的任何其他列。每列中的DISTINCT值将作为数组返回。
性能仍然是臭的,因为我不认为你可以避免做多个不同的DISTINCT操作。
如果您正在寻找的话,请告诉我。
答案 1 :(得分: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
在生产中实施此功能之前,请先尝试基准测试。