0

関連するトピックをすべて読んだ後でも、何も役に立ちません。

$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'];

私が得るエラー:

Notice: 未定義のインデックス: num in .... on line ..

私は何を間違っていますか?

4

5 に答える 5

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%'
于 2012-06-26T15:22:35.790 に答える
1

質問を編集して、クエリをより適切にレイアウトしました。問題は、エイリアスを結果の値ではなく副選択に割り当てていることです。さらに、行数をカウントする場合、パフォーマンス上の理由から、count(*)` はカウントをインクリメントする前に実際の行を取得する必要があるため、count(1)thenを実行する方がはるかに優れています。代わりにこれを試してください:count(*)count(1) simply uses the constant in counting, while

$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";
于 2012-06-26T15:25:39.127 に答える
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";

これにより、結果ではなくカウントが得られます。したがって、それらを合計するのではなく、カウントをカウントしています。

于 2012-06-26T15:24:11.703 に答える
1

クエリを再フォーマットすると、最後の「as num」がカウント(*)ではなく、選択全体を参照していることがわかります。これは、エイリアスにしたいものだと思います。

クエリは常にエントリごとに別々の行にフォーマットするようにしてください。これはデバッグに非常に役立ちます。

于 2012-06-26T15:24:48.833 に答える
0

あなたのクエリ (outermost をエイリアスするcount(*) as numと、2 つのサブクエリから "total" としてエイリアス化された式が等しいかどうかに応じて、1 または 2 のいずれかが返されます。

UNION を使用して、clipsこの結果を返すためにテーブルを 2 回スキャンする必要はありません。1 回のスキャンで十分です。このクエリは、クリップ テーブルを 1 回スキャンして同等の結果を返します。

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

これは、クエリよりも効率的に実行される可能性があります。

そうは言っても、これが本当に求めている結果セットであることはまったく明らかではありません。


補遺: 訂正。このクエリは完全に同等ではありません。このクエリは、クリップ テーブルが空の場合 (行が含まれていない場合) に異なる結果を返します。これは修正される可能性がありますが、これが実際に Mark が求めている結果セットであるとは思えません。

クリップ テーブルが空の状態を処理するには:

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
于 2012-06-26T15:39:39.697 に答える