2012-06-26 38 views
0

即使閱讀所有相關的主題工作後,沒有什麼幫助:計數都不能正確使用UNION

$q="select count(*) from (
     SELECT COUNT(*) AS total 
      FROM clips 
     WHERE ((dimensions like('%concert%') AND dimensions NOT like('concert')) 
      OR (file_format like('%concert%') AND file_format NOT like('concert'))) 
     UNION DISTINCT 
     SELECT COUNT(*) AS total 
      FROM clips 
     WHERE (dimensions like('concert') OR file_format like('concert')) 
    ) AS num"; 
$q2 = mysql_query($q) or die(mysql_error()); 
$q3 = mysql_fetch_array($q2); 
echo $q3['num']; 

的錯誤,我得到:

注意:未定義指數:NUM中....在線..

我在做什麼錯?

+3

什麼在$ Q3 :)做過的var_dump上呢? – Brian

+0

array(2){[0] => string(1)「1」[「count(*)」] => string(1)「1」} – Mark

+0

您的AS號是錯誤的。 –

回答

2

您正在將num設置爲表別名,而不是計數。試試這個

$q="select count(*) AS num from (
    SELECT COUNT(*) AS total 
     FROM clips 
    WHERE ((dimensions like('%concert%') AND dimensions NOT like('concert')) 
     OR (file_format like('%concert%') AND file_format NOT like('concert'))) 
    UNION DISTINCT 
    SELECT COUNT(*) AS total 
     FROM clips 
    WHERE (dimensions like('concert') OR file_format like('concert')) 
) AS sub_query_alias_that_is_required_but_pointless"; 
$q2 = mysql_query($q) or die(mysql_error()); 
$q3 = mysql_fetch_array($q2); 
echo $q3['num']; 

然而,你可能尋找更多的預期功能是計算總的行,就像你有它不計計數。此外,由於你只是查詢clips表,我認爲你根本不需要UNION。根據你在問題中的邏輯,我認爲(但是不能在沒有你的實際數據的情況下進行測試),它在邏輯上等同於這個非常簡單的查詢,除非我嚴重遺漏某些東西。這個查詢可能更友好,更乾淨。

SELECT COUNT(1) AS num 
FROM clips 
WHERE dimensions like '%concert%' 
    OR file_format like '%concert%' 
+0

它死了:每個派生表都必須有自己的別名 – Mark

+0

@Mark ok然後給它一個不同的別名,只是不是num。我所做的一點是,你正在調用子查詢'num',而不是計數結果。我將編輯更清晰 –

1

您的查詢計數來自名爲'num'的子查詢的結果。

這意味着,沒有結果中名爲num,你可以不喜歡select count(*) as myNum from...

現在你所計算的是:

(SELECT COUNT(*) AS total 
FROM clips 
WHERE ((dimensions like('%concert%') 
     AND dimensions NOT like('concert')) 
     OR (file_format like('%concert%') AND file_format NOT like('concert'))) 
UNION DISTINCT 
SELECT COUNT(*) AS total FROM clips 
    WHERE (dimensions like('concert') OR file_format like('concert'))) AS num"; 

這會給你一個數,而不是結果。所以你在計數,而不是把它們加在一起。

+0

謝謝指出。 'selected'答案解決了語法問題,但似乎並沒有解決SQL的一個更基本的問題。 – spencer7593

+0

而不是「count」可能想「總結」2個獨立的結果? – Nanne

1

一旦你重新格式化你的查詢,你會看到最後的「as num」被引用到整個select中,而不是count(*),我猜這就是你想要的別名。

嘗試始終格式化您的查詢在單獨的行中爲每個條目,它極大地幫助您的調試。

+0

謝謝,我將從此開始:) – Mark

1

我編輯你的問題,以更好地佈局查詢。問題在於你正在給子查詢分配別名而不是結果值。另外,當你計算行數時,出於性能原因,count(1)然後count(*)要好得多,因爲count(1) simply uses the constant in counting, while count(*)`必須在遞增計數之前檢索實際行。試試這個:

$q="select count(1) as num from (
     SELECT COUNT(1) AS total 
      FROM clips 
     WHERE ((dimensions like('%concert%') AND dimensions NOT like('concert')) 
      OR (file_format like('%concert%') AND file_format NOT like('concert'))) 
     UNION DISTINCT 
     SELECT COUNT(1) AS total 
      FROM clips 
     WHERE (dimensions like('concert') OR file_format like('concert')) 
    ) AS sub"; 
+0

謝謝!有用! 「AS sub」的含義是什麼? (因爲它做出了改變) – Mark

+0

它並沒有真正有所作爲。第一行「select count(1)as num」的改變做到了。你甚至可以刪除最後一個「AS sub」 –

+0

實際上我不能,它死了:每個派生表都必須有自己的別名 – Mark

0

您的查詢(一旦你別名最count(*) as num,將會返回1或2,根據您的兩個子查詢別名爲「總」的表述是否相等或不

這是沒有必要使用UNION並通過clips表掃描兩次返回這個結果 一次掃描就足夠了這個查詢將返回同樣的結果,通過剪輯表中的單個掃描:。

SELECT CASE WHEN c.total_1 = c.total_2 THEN 1 ELSE 2 END AS num 
    FROM 
(
SELECT SUM(CASE WHEN ((dimensions like('%concert%') AND dimensions NOT like('concert')) 
        OR (file_format like('%concert%') AND file_format NOT like('concert'))) 
       THEN 1 ELSE 0 END 
     ) AS total_1 
    , SUM(CASE WHEN (dimensions like('concert') OR file_format like('concert')) 
       THEN 1 ELSE 0 END 
     ) AS total_2 
    FROM clips 
) c 

這可能會比您的查詢更高效地運行。

說了這麼多,一點也不清楚,這是你真正追求的結果集。


附錄:更正。該查詢不完全等同。當剪輯表爲空時(不包含行),此查詢將返回不同的結果。這可能是固定的,但我不相信這實際上是馬克之後的結果集。

來處理情況,剪輯表是空的條件:

SELECT CASE WHEN IFNULL(c.total_1,0) = IFNULL(c.total_2,0) THEN 1 ELSE 2 END AS num 
    FROM (SELECT 1) i LEFT JOIN 
(
SELECT SUM(CASE WHEN ((dimensions like('%concert%') AND dimensions NOT like('concert')) 
        OR (file_format like('%concert%') AND file_format NOT like('concert'))) 
       THEN 1 ELSE 0 END 
     ) AS total_1 
    , SUM(CASE WHEN (dimensions like('concert') OR file_format like('concert')) 
       THEN 1 ELSE 0 END 
     ) AS total_2 
    FROM clips 
) c 
+0

我不熟悉這個語法(因爲我在MySQL中的知識有限),所以我只是複製粘貼它,結果是:「每個派生表都必須有自己的別名」。代碼是否被切斷(最後一個字符是「c」)? – Mark

+0

這些SQL語句中的最後一個字符(「c」)是派生表所需的別名。它需要在那裏。 – spencer7593