2017-02-15 124 views
0

我有一组常量用户,我想过滤出来并应用于每个查询以查看他们在应用中正在执行的操作。我一直在探索和探索如何做到这一点,但我仍然不清楚。我是一个SQL语句和JAVA的新手。任何帮助,特别是解释是非常受欢迎的。在SQL中选择语句,联接和重新使用查询

我一直在试图弄清楚使用这两篇​​文章无济于事:1 & 2;这些示例显示了如何创建查询并在另一个查询中使用它,这正是我想要做的。

有人提到了一个包裹(见参考文献1)。而这正是我试图做的事:

当然,包裹在外部查询你的两个组操作与选择,其中包括固定列称为来源,即SELECT 'horrible_query_1' AS Source, * and SELECT 'ugly_query_2' AS Source, *.

这样,您的UNION将为您提供查询中的所有列和源标识符。

我的问题:是否有可能将这些查询重新定位到单独的查询中,而无需与变量进行连接?我不明白这是如何工作的(我不确定我是否正确地说)。

这是用户组和过滤器我想在所有的查询进行重构:

<select id="get_num_x_users" resultClass="java.lang.Integer"> 
select count(distinct user_id) from positions sp 
    join position_definitions sd on sp.position_id = sd.id 
    where sd.position like '%catcher%' 
      or lower(sd.position) like '%pitcher%' 
      or lower(sd.position) like '%dh%'; 
    </select> 

重新利用到该查询(其中少数人):

<select id="get_u_counts" resultClass="java.lang.Integer"> 
    SELECT COUNT(DISTINCT u.id) 
    FROM searches s 
    JOIN users u 
    ON s.user_id   = u.id 
    WHERE search_date  > DATE_SUB(curdate(), INTERVAL 3 MONTH) 
    AND LENGTH(search_term) > 0 
    AND search_term NOT LIKE ' LIC: SPEC: %' 
    AND u.type != 'coach'; 
</select> 

我尝试(不当我在mysql数据库中工作时):

with get_x_users as (
     select count(distinct user_id) from positions sp 
     join position_definitions sd on sp.position_id = sd.id 
     where sd.position like '%catcher%' 
      or lower(sd.position) like '%pitcher%' 
      or lower(sd.position) like '%dh%';), 

(SELECT COUNT(get_x_users) 
FROM searches s 
JOIN users u 
ON s.user_id = u.id 
AND get_x_users 
WHERE search_date  > DATE_SUB(curdate(), INTERVAL 3 MONTH) 
AND LENGTH(search_term) > 0 
AND u.type != 'coach'); 
+0

为什么你从位置sp返回一个计数“select count(distinct user_id)...”?你不能加入。您应该返回一个不同的user_id列表“从位置sp选择不同的user_id”,并将user_id加入到主查询中的u.id中。 – strattonn

+0

@strattonn你能告诉我你的意思吗? – thesayhey

回答

0

在SQL中,我们可以将表一起使用共同的领域。例如,如果在两个不同的表中有一个user_id字段,则可以使用该公用字段匹配记录。您还可以创建一个连接,该连接为您提供一个表中的所有记录,并且只有那些与第二个表中匹配的记录,这就是LEFT JOIN所做的。

使用此原则,您可以执行一些逆向逻辑并创建一个查询,该查询会为您提供搜索查询(ExcludeQuery)中的所有记录,并将其添加到您想要排除的用户。这会给你一个有排除用户的匹配记录列表。然后,您所做的是使用where来仅包含与排除的用户不匹配的记录,WHERE ExcludeQuery.user_id IS NULL。

SELECT s.* 
FROM searches s 
JOIN users u 
ON s.user_id = u.id 
WHERE search_date  > DATE_SUB(curdate(), INTERVAL 3 MONTH) 
AND LENGTH(search_term) > 0 AND u.type != 'coach' 
LEFT JOIN 
(select user_id from positions sp 
    join position_definitions sd on sp.position_id = sd.id 
    where sd.position like '%catcher%' 
    or lower(sd.position) like '%pitcher%' 
    or lower(sd.position) like '%dh%') AS ExcludeQuery 
ON ExcludeQuery.user_id=s.user_id 
WHERE ExcludeQuery.user_id IS NULL