8

MySQLテーブルに次のデータがあります。

+--------+----------+------+
| job_id | query_id | done |
+--------+----------+------+
|  15145 | a002     |    1 |
|  15146 | a002     |    1 |
|  15148 | a002     |    1 |
|  15150 | a002     |    1 |
|  15314 | a003     |    0 |
|  15315 | a003     |    1 |
|  15316 | a003     |    0 |
|  15317 | a003     |    0 |
|  15318 | a003     |    1 |
|  15319 | a003     |    0 |
+--------+----------+------+

query_id IF ALL 'done' フィールドが 1 としてマークされている場合にグループ化できる SQL クエリを使用できるかどうかを知りたいです。私が想像する可能な出力は次のようになります。

+----------+------+
| query_id | done |
+----------+------+
|  a002    |  1   |
|  a003    |  0   |
+----------+------+

次のSQLクエリを試しました:

select job_id, query_id, done from job_table group by done having done = 1 ;

しかし、運がありません。何か助けていただければ幸いです!

4

5 に答える 5

7

あまり明確ではないため、このソリューションを特に誇りに思っているわけではありませんが、少なくとも高速でシンプルです。すべてのアイテムが"done" = 1の場合、合計はカウント SUM = COUNT と等しくなります。

SELECT query_id, SUM(done) AS doneSum, COUNT(done) AS doneCnt 
FROM tbl 
GROUP BY query_id

また、having 句を追加すると、「完了」した項目が得られます。

HAVING doneSum = doneCnt

ソリューションを適切にフォーマットします。DIFERENCE を実行して、「未完了」項目または doneSum <> doneCnt を取得できます。

ところで、SQLフィドルはこちらです。

于 2013-03-04T14:03:59.673 に答える
-1

のようなものを試してください

SELECT qry_id, 1
FROM (
    SELECT qry_id, done
    FROM tbl
    GROUP BY qry_id, done
) AS t
GROUP BY qry_id
HAVING COUNT(*)=1
UNION
SELECT qry_id, 0
FROM (
    SELECT qry_id, done
    FROM tbl
    GROUP BY qry_id, done
) AS t
GROUP BY qry_id
HAVING COUNT(*)>1
于 2013-03-04T13:52:16.437 に答える
-3

これを見ればいいと思う

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
于 2013-03-04T13:52:13.957 に答える