0
SELECT
  ( SELECT
       SUM(IF(status = 'Active', 1, 0)) AS `univ_active`,
       SUM(IF(status = 'Inactive', 1, 0)) AS 'univ_inactive',
       Count(*)
    FROM online_university
  ) 
 AS tot_university,
( SELECT 
    SUM(IF(status = 'Active', 1,0)) AS `user_active`,
    SUM(IF(status = 'Inactive', 1,0)) AS 'user_inactive'
    Count(*)
  FROM online_register_user)
AS tot_users

結果は

univ_active=4 univ_inactive=2 tot_university=6
user_active=10 user_inactive=3 tot_users = 13

どうすればこれを入手できますか? ERROR: Operand should contain 1 column(s) を返す上記のクエリ

これは、テーブルからアクティブ、非アクティブ、合計レコードを返すすべてのテーブルからプロジェクトのレポートを準備するためのものです。この方法が間違っている場合、何を使用すればよいですか? なにか提案を。

4

4 に答える 4

3

サブクエリは 1 つの列のみを返すことができます。単一のサブクエリで、複数のサブクエリ、結合、または安価な連結ハック ( CONCAT_WS(',', SUM(IF(status = 'Active', 1,0)), SUM(IF(status = 'Inactive', 1,0))) を実行する必要があります。

于 2009-11-23T05:08:15.867 に答える
2

エラーが示すように、2 つの列を返すサブクエリを選択しています。

SELECT (one_thing, another_thing) AS combined_thing

SQL には存在しません。各サブクエリを個別に配置する必要があります。

SELECT (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_university
) AS univ_active, (
    SELECT SUM(IF(status='Inactive', 1, 0)) FROM online_university
) AS univ_inactive, (
    SELECT SUM(IF(status='Active' OR status='Inactive', 1, 0)) FROM online_university
) AS tot_university, (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_register_user
) AS user_active, (
    -- and so on

ただし、これらすべてを 1 つのクエリで実行しても、実際には何のメリットもありません。言う方がはるかに簡単です:

SELECT COUNT(*) FROM online_university WHERE status='Active';  -- univ_active
SELECT COUNT(*) FROM online_university WHERE status='Inactive';  -- univ_inactive
SELECT COUNT(*) FROM online_university;  -- tot_university
SELECT COUNT(*) FROM online_register_user WHERE status='Active';  -- user_active
    -- and so on

次に、これらの結果をアプリケーション層で一緒に提示します。WHERE 句はより高速で、SUM/IF などの計算式では使用できない適切なインデックスを使用できます。

さらに簡単:

SELECT status, COUNT(*) FROM online_university GROUP BY status;
SELECT status, COUNT(*) FROM online_register_user GROUP BY status;
于 2009-11-23T05:19:17.550 に答える
1

BipedalShark が言ったように、クエリには 1 列が必要ですが、現在は 2 列になっています。しかし、それ以外に、count(*) と where 句の使用を考える必要があります。したがって、次のようになります。

select
 (select count(*) from online_university where status = 'Active') as univ_active,
 (select count(*) from online_university where status = 'Inactive') as univ_inactive,
 (select count(*) from online_register_user where status = 'Active') as user_active,
 (select count(*) from online_register_user where status = 'Active') as user_inactive
于 2009-11-23T05:15:13.730 に答える
1

質問で行ったようにクエリをレイアウトすると、たとえば tot_university というエイリアスが 2 つの列に関連付けられることは非常に明白になりますが、これは不可能です...

この構文/論理エラーは別として、クエリ全体の構造が不十分で、目的の結果が得られないようです。

宿題や自己課題学習に非常によく似ているので、既製のクエリで台無しにするつもりはありません。代わりに、いくつかのヒントを示します。

  • 情報は 2 つの別個の無関係なテーブルから取得されます。おそらく、UNION を使用して 1 つのクエリで結果を取得します (2 つのクエリを効果的に実行しながら) (次に、「Univ」、「Public」などのテキストを含む追加の列を使用して、2 つを区別します)行)
  • SUM(IF column = x, 1,0) は、特定の値をカウントするための優れたトリックです。グループ化を行う必要はなく、基本的に 1 つのステップでカウントを「ロールアップ」します。
  • concat() トリックは、たとえばレポートにそのまま書き込むなど、テキスト型の結果のみに焦点を当てている場合に適しています。それ以外の場合は、結果を別の列に保持して、さらに処理し、テーブルなど...
于 2009-11-23T05:12:33.937 に答える