我有以下数据库结构(简化):

id | company_name | parent | count_of_facilities | longitude | latitude
1  | Apple        |  0     | 3                   |  ...      | ...
2  | Apple        |  1     | 3                   |  ...      | ...
3  | Apple        |  1     | 3                   |  ...      | ...
4  | Bmw          |  0     | 2                   |  ...      | ...
5  | Bmw          |  4     | 2                   |  ...      | ...
6  | HP           |  0     | 5                   |  ...      | ...
7  | HP           |  6     | 5                   |  ...      | ...
8  | HP           |  6     | 5                   |  ...      | ...
9  | HP           |  6     | 5                   |  ...      | ...
10 | HP           |  6     | 5                   |  ...      | ...


我要做什么-我想让所有公司都在某个位置;到目前为止,我是这样进行的:

@companies = Company.select('COUNT(id) AS grouped_facilities,
                             GROUP_CONCAT(id) AS grouped_facilities_ids')
                          .includes(:services)
                          .within(distance, origin: [lat,lng])
                          .where('companies.corporate_hq   = "0""')
                          .group('companies.company_name')
                          .order("companies.count_of_facilities DESC")


到目前为止,此解决方案仍然有效,但是根据名称将公司分组并不完美-因此我在列parent中添加了名称。根公司/母公司已在此处设置0以及母公司的所有其他“子公司” ID。

如果我搜索特定的位置,我想查找该位置有多少设施,并显示母公司+给定位置的设施数量。

我尝试用groupcompanies.parent公司,但这可能不起作用,因为有很多公司使用companies.parent = 0,对吗?

如何获得所需的输出而不是使用group('companies.company_name

编辑:

给定位置的期望输出:

Apple - 1 facility in this area
BWM - 2 facilities in this area
HP - 2 facilities in this area

最佳答案

您想考虑如何以Rails的方式做更多的事情,并尽可能避免使用原始SQL。应避免编写原始SQL查询!例如,要查找所有“母公司”:

@companies = Company.where(:parent => 1).within(distance, origin: [lat,long]).where(:corporate_hq => 0)


更加清洁,它使查询优化器可以完成其工作,而ActiveRecord可以为您抽象事物。

这并不是说您永远不需要使用实际的SQL进行扩充,而是尽可能避免使用它。它使您更具可移植性,并允许您在某些时候以最小的麻烦换出数据库后端。您已经在某种程度上做到了。.只需继续考虑按条件设置的事情(SQL语句)并继续添加复合语句。

关于mysql - 如何显示具有给定位置设施数量的“母公司”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35540865/

10-13 02:18