如何将此 SQL 查询转换为 Active Record 语句,有很多答案都不能帮助我?
How do I convert this SQL query into Active Record statements, there are many answers those are not help me out?
查询如下:
SELECT
DISTINCT
((substring(r2.email FROM position('@' IN r2.email) + 1))) AS unknown_domain,
count(DISTINCT (c2.id)) as contact_count,
count(DISTINCT (dc.id)) as dc_count
FROM
(SELECT
unnest(emails) AS email,
id
FROM contacts c
WHERE account_id = 612) AS r2
INNER JOIN domains d
ON d.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))
INNER JOIN contacts c2
on c2.id = r2.id
INNER JOIN device_contacts dc
on dc.contact_id = c2.id
where d.freebie = 'f'
AND (NOT exists(SELECT 1
FROM (SELECT unnest(email_domains) :: CHARACTER VARYING AS domain
FROM companies) AS results
WHERE results.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))))
AND (defunct = FALSE OR defunct IS NULL)
AND (dc.emails && ARRAY[r2.email]::character varying[])
GROUP BY unknown_domain
ORDER BY dc_count DESC, contact_count DESC;
虽然我不知道如何将其转换为活动记录查询。我看过许多 rails 个网站。我完全不知道如何处理这个问题。我尝试了几次不同的尝试,但都失败了。
如果 SQL 有效,您无需经历不必要的痛苦来转换它...您可以按原样使用它。使用一个heredoc
将其加载到一个变量中,并调用连接#execute
my_sql <<SQL_STRING
SELECT
DISTINCT
((substring(r2.email FROM position('@' IN r2.email) + 1))) AS unknown_domain,
count(DISTINCT (c2.id)) as contact_count,
count(DISTINCT (dc.id)) as dc_count
FROM
(SELECT
unnest(emails) AS email,
id
FROM contacts c
WHERE account_id = 612) AS r2
INNER JOIN domains d
ON d.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))
INNER JOIN contacts c2
on c2.id = r2.id
INNER JOIN device_contacts dc
on dc.contact_id = c2.id
where d.freebie = 'f'
AND (NOT exists(SELECT 1
FROM (SELECT unnest(email_domains) :: CHARACTER VARYING AS domain
FROM companies) AS results
WHERE results.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))))
AND (defunct = FALSE OR defunct IS NULL)
AND (dc.emails && ARRAY[r2.email]::character varying[])
GROUP BY unknown_domain
ORDER BY dc_count DESC, contact_count DESC;
SQL_STRING
my_records = ActiveRecord::Base.connection.execute(my_sql)
查询如下:
SELECT
DISTINCT
((substring(r2.email FROM position('@' IN r2.email) + 1))) AS unknown_domain,
count(DISTINCT (c2.id)) as contact_count,
count(DISTINCT (dc.id)) as dc_count
FROM
(SELECT
unnest(emails) AS email,
id
FROM contacts c
WHERE account_id = 612) AS r2
INNER JOIN domains d
ON d.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))
INNER JOIN contacts c2
on c2.id = r2.id
INNER JOIN device_contacts dc
on dc.contact_id = c2.id
where d.freebie = 'f'
AND (NOT exists(SELECT 1
FROM (SELECT unnest(email_domains) :: CHARACTER VARYING AS domain
FROM companies) AS results
WHERE results.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))))
AND (defunct = FALSE OR defunct IS NULL)
AND (dc.emails && ARRAY[r2.email]::character varying[])
GROUP BY unknown_domain
ORDER BY dc_count DESC, contact_count DESC;
虽然我不知道如何将其转换为活动记录查询。我看过许多 rails 个网站。我完全不知道如何处理这个问题。我尝试了几次不同的尝试,但都失败了。
如果 SQL 有效,您无需经历不必要的痛苦来转换它...您可以按原样使用它。使用一个heredoc
将其加载到一个变量中,并调用连接#execute
my_sql <<SQL_STRING
SELECT
DISTINCT
((substring(r2.email FROM position('@' IN r2.email) + 1))) AS unknown_domain,
count(DISTINCT (c2.id)) as contact_count,
count(DISTINCT (dc.id)) as dc_count
FROM
(SELECT
unnest(emails) AS email,
id
FROM contacts c
WHERE account_id = 612) AS r2
INNER JOIN domains d
ON d.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))
INNER JOIN contacts c2
on c2.id = r2.id
INNER JOIN device_contacts dc
on dc.contact_id = c2.id
where d.freebie = 'f'
AND (NOT exists(SELECT 1
FROM (SELECT unnest(email_domains) :: CHARACTER VARYING AS domain
FROM companies) AS results
WHERE results.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))))
AND (defunct = FALSE OR defunct IS NULL)
AND (dc.emails && ARRAY[r2.email]::character varying[])
GROUP BY unknown_domain
ORDER BY dc_count DESC, contact_count DESC;
SQL_STRING
my_records = ActiveRecord::Base.connection.execute(my_sql)