从每列中选择不同的值

时间:2018-01-23 04:51:15

标签: mysql sql ruby-on-rails ruby

有没有办法从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

2 个答案:

答案 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

在生产中实施此功能之前,请先尝试基准测试。