我有一组常量用户,我想过滤掉并应用于每个查询,以查看他们在应用上做了什么。我一直在探索和探索这里,以更好地了解如何做到这一点,但我仍然不清楚。我是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');
答案 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