2017-02-15 128 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