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 |
+--------+----------+------+

我想知道是否有可能有一个 sql 查询,它可以按 query_id IF ALL 'done' 字段标记为 1。我想象的可能输出是:

+----------+------+
| 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

我对这个解决方案并不特别自豪,因为它不是很清楚,但至少它既快速又简单。如果所有项目都“完成”= 1,那么总和将等于计数 SUM = COUNT

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

如果你添加一个有子句,你会得到“完成”的项目。

HAVING doneSum = doneCnt

我会让你正确格式化解决方案,你可以做一个 DIFERENCE 来获得“未完成”的项目或 doneSum <> doneCnt。

顺便说一句,这里的 SQL 小提琴。

于 2013-03-04T14:03:59.673 回答
2

所有“完成”的工作:

SELECT * FROM job_table GROUP BY done HAVING MIN(done) = 1;

所有“未完成”的工作:

SELECT * FROM job_table GROUP BY done HAVING MAX(done) = 0;

所有具有相同值的作业(“完成”或“撤消”):

SELECT * FROM job_table GROUP BY done HAVING MAX(done) = 0 OR MIN(done) = 1;
于 2017-07-13T08:34:58.830 回答
0

您的示例中的输出可以通过以下方式获得:

SELECT query_id, min(done) as done
FROM job_table
GROUP by done
于 2021-05-18T07:16:02.857 回答
-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 回答