在SQL中选择语句,联接和重新调整查询

时间:2017-02-15 21:08:13

标签: java mysql sql database select

我有一组常量用户,我想过滤掉并应用于每个查询,以查看他们在应用上做了什么。我一直在探索和探索这里,以更好地了解如何做到这一点,但我仍然不清楚。我是SQL语句和JAVA的新手。任何帮助,尤其是解释都非常受欢迎。

我一直试图用这两篇文章来解决这个问题:1& 2;这些示例显示了如何创建查询并在另一个查询中使用它,这正是我想要做的。

有人提到了一个包装(见参考文献1),这就是我试图做的事情:

  

当然,将外部查询中的两个集合操作包含在包含名为Source的固定列的选项中,即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');

1 个答案:

答案 0 :(得分: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