1

2 つの SQL クエリを別々に実行しています。2 つをマージして、1 つのクエリ内で両方のデータ セットを抽出できるようにしたいと考えています。

クエリは ExpressionEngine クエリ モジュールを使用しており、以下のとおりです。total と total_2 を 1 つのクエリで抽出したいと思います。

クエリ 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"
4

4 に答える 4

0

2 つのクエリを結合します。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"
于 2013-05-08T12:15:08.977 に答える
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"

ユニオンを行うよりもこれを行う利点は、ユニオンベースのアプローチでは、エンジンとその最適化アプローチによっては、サーバー側で 2 倍の労力が必要になる場合があることです。

于 2013-05-08T12:15:12.347 に答える
0

UNIONorを使用して 2 つのクエリを組み合わせることができます。1 つUNION ALL目は重複を削除しますが、2 つ目は重複を削除しません (したがって、2 つ目は多くの場合高速です)。しかし、多くの場合、2 つの結果を同時に選択するようにクエリを調整する方が適切 (かつ高速) です。

この場合:

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"
于 2013-05-08T12:15:29.683 に答える
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"
于 2013-05-08T12:15:34.163 に答える