1

has_object各行にデジタルオブジェクトが関連付けられているかどうかを示すブール列を含む表の下にあります。

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| pid        | varchar(255) | NO   | PRI |         |       |
| title      | text         | YES  |     | NULL    |       |
| owner_uid  | int(11)      | YES  |     | NULL    |       |
| has_object | int(11)      | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

このクエリを試して、それぞれの統計情報を取得しowner_uidました。しかし、私のテーブルでは間違った結果を返します:

SELECT 
  a.owner_uid, 
  count(b.pid) as count1, 
  count(c.pid) as count2  
FROM
  islandora_report a
  JOIN islandora_report b ON b.owner_uid = a.owner_uid AND b.has_object = 0
  JOIN islandora_report c ON c.owner_uid = a.owner_uid AND c.has_object = 1
GROUP BY a.owner_uid;

結果:

ここに画像の説明を入力

4

3 に答える 3

1

やってみませんか:

SELECT
  owner_id, count(*), has_object = 1 as has_it
FROM islandora_report
GROUP BY owner_id,has_it
于 2012-10-12T18:01:54.023 に答える
1

BOOLEANは単に0またはであるため、1実際にはSUM()結合なしで の 1 つのペアを実行して、列を合計できます。

SELECT
  owner_uid,
  /* SUM() adds up all the 1 values */
  SUM(has_object) AS count_true,
  /* Invert the boolean with a case statement to get the inverse */
  SUM(CASE WHEN has_object = 1 THEN 0 ELSE 1 END) AS count_false
FROM islandora_report
GROUP BY owner_uid

上記の方法以外にもブール値を反転する方法があります。最初に思い浮かんだだけです。合計数から真の合計を差し引くこともできます。次に例を示します。

SUM(has_object) AS count_true,
COUNT(*) - SUM(has_object) AS count_false
于 2012-10-12T17:53:28.833 に答える
1

実際には結合は必要ありません。あなたは書ける:

SELECT owner_uid,
       COUNT(CASE WHEN has_object = 0 THEN 1 END) AS count1,
       COUNT(CASE WHEN has_object = 1 THEN 1 END) AS count2
  FROM islandora_report
 GROUP
    BY owner_uid
;
于 2012-10-12T17:53:53.283 に答える