2013-05-08 116 views
1

我有2個sql查詢單獨運行,我想要做的是合併兩個,所以我可以在一個查詢中提取兩組數據。合併2 sql查詢

該查詢使用的ExpressionEngine查詢模塊和低於,我想提取總和TOTAL_2在一個查詢:

查詢1:

SELECT COUNT(exp_channel_data.entry_id) AS total 
FROM exp_channel_data 
JOIN exp_channel_titles 
    ON exp_channel_titles.entry_id = exp_channel_data.entry_id 
WHERE field_id_207 != '' 
    AND status = 'open' 
    AND exp_channel_data.channel_id = '18' 
    AND author_id = "CURRENT_USER" 

問題2:

SELECT COUNT(exp_channel_data.entry_id) AS total_2 
FROM exp_channel_data 
JOIN exp_channel_titles 
    ON exp_channel_titles.entry_id = exp_channel_data.entry_id 
    WHERE status = 'open' 
    AND exp_channel_data.channel_id = '18' 
    AND author_id = "CURRENT_USER" 
+1

我不知道我得到它。兩個Querys在我看來都是一樣的,只有一個在其中有一個WHERE。查詢#2是否具有Query#1的內容? – Meoiswa 2013-05-08 12:17:14

+0

嗨尼克,他們是非常相似的唯一的區別是查詢1是拉的結果field_id_207不是空的所有條目。 Field_id_207是與其他條目相關的字段,因此我將總條目(查詢2)和條目數與相關條目(查詢1)拉在一起。感謝:) – Ben 2013-05-08 12:54:25

+0

我仍然不明白,你的查詢#2包含查詢#1,你無法加入他們,因爲那樣你會得到重複的行。這就是爲什麼在嘗試下面的任何答案時出現錯誤 – Meoiswa 2013-05-08 12:58:44

回答

0
SELECT 
    SUM(CASE WHEN field_id_207 != '' then 1 else 0 end) as total_1, 
    COUNT(exp_channel_data.entry_id) AS total_2 
FROM exp_channel_data 
JOIN exp_channel_titles 
ON exp_channel_titles.entry_id = exp_channel_data.entry_id 
AND status = 'open' 
AND exp_channel_data.channel_id = '18' 
AND author_id = "CURRENT_USER" 
+0

Hi Derek,謝謝你的迴應。我收到一個錯誤500(內部服務器錯誤)與此查詢,與下面的相同。我目前正在MAMP本地設置上運行。 – Ben 2013-05-08 12:55:42

+0

忽略我,現在工作正常:)。謝謝 – Ben 2013-05-08 12:58:22

0

union加入這兩個查詢

SELECT COUNT(exp_channel_data.entry_id) AS total FROM exp_channel_data JOIN exp_channel_titles ON exp_channel_titles.entry_id = exp_channel_data.entry_id WHERE field_id_207 != '' AND status = 'open' AND exp_channel_data.channel_id = '18' AND author_id = "CURRENT_USER" 

union 

SELECT COUNT(exp_channel_data.entry_id) AS total_2 FROM exp_channel_data JOIN exp_channel_titles ON exp_channel_titles.entry_id = exp_channel_data.entry_id AND status = 'open' AND exp_channel_data.channel_id = '18' AND author_id = "CURRENT_USER" 

你可能需要添加一個字段來區分哪些查詢您正在尋找在

SELECT 'q1' source, COUNT(exp_channel_data.entry_id) AS total FROM exp_channel_data JOIN exp_channel_titles ON exp_channel_titles.entry_id = exp_channel_data.entry_id WHERE field_id_207 != '' AND status = 'open' AND exp_channel_data.channel_id = '18' AND author_id = "CURRENT_USER" 

union 

SELECT 'q2' source, COUNT(exp_channel_data.entry_id) AS total_2 FROM exp_channel_data JOIN exp_channel_titles ON exp_channel_titles.entry_id = exp_channel_data.entry_id AND status = 'open' AND exp_channel_data.channel_id = '18' AND author_id = "CURRENT_USER" 
0

你可以運行這樣的查詢。鑑於您尚未說明您正在使用哪種SQL方言,您的里程可能會有所不同。

SELECT SUM(CASE WHEN field_id_207 != '' THEN 1 ELSE 0 END) AS total, COUNT(exp_channel_data.entry_id) AS total_2 
FROM exp_channel_data 
JOIN exp_channel_titles ON exp_channel_titles.entry_id = exp_channel_data.entry_id 
WHERE status = 'open' 
AND exp_channel_data.channel_id = '18'" 
AND author_id = "CURRENT_USER" 

做這個做了一個聯合的好處是,基於聯合的方式可能需要對服務器的一部分兩倍的努力 - 根據發動機和它的優化方法。

0

您可以結合兩個查詢與UNIONUNION ALL,第一刪除重複,而第二個沒有(因此第二是經常更快)。但是,調整查詢以同時選擇兩個結果往往更好(也更快)。

在這種情況下:

SELECT 
    COUNT(exp_channel_data.entry_id) AS count_total_entryid, 
    SUM(IF(field_id_207!='';1;0)) AS count_nonempty_entryid 
FROM exp_channel_data 
JOIN exp_channel_titles ON exp_channel_titles.entry_id = exp_channel_data.entry_id 
WHERE status = 'open' 
    AND exp_channel_data.channel_id = '18' 
    AND author_id = "CURRENT_USER"