4

私のmysqlデータベースにこのテーブルがあります

+-----+----------+------+----------+
| id  | group_id | a_id | status   |
+-----+----------+------+----------+
|   2 |      144 |  266 | active   |
|   7 |      160 |  105 | inactive |
|   8 |        0 |  262 | inactive |
|  11 |      120 |  260 | inactive |
|  12 |      120 |  260 | inactive |
|  13 |      121 |  260 | active   |
|  14 |      122 |  258 | active   |
|  14 |      122 |  258 | inactive |
|  16 |      130 |  210 | active   |
|  17 |      130 |  210 | active   |
+-----+----------+------+----------+

同じグループ (group_id) 内のすべてのステータスが非アクティブで、0 以外である必要があるように、a_id を選択する必要があります。実際に取得したいのは、このテーブルからの ID (105,260) の配列です。

私はこのSQLに来ましたが、明らかに正しく動作していません:

select a_id from tab_name where group_id<>0 and group_id in 
  (select group_id from tab_name where status="inactive" 
    group by group_id having status="inactive")
4

5 に答える 5

4
SELECT   DISTINCT a_id
FROM     yourtable
WHERE    group_id!=0
GROUP BY a_id, group_id
HAVING   SUM(status='inactive')=COUNT(*);

ここでフィドルを参照してください。

于 2013-06-28T09:25:05.247 に答える
0

問題は、クエリの場合、非アクティブな行が 1 つある場合、そのグループが返されることです。代わりに、非アクティブなアイテムや group_id が 0 のアイテムがグループにないことを確認するサブクエリを試すことができます。

SELECT t1.a_id FROM tab_name t1 
WHERE NOT EXISTS(
               SELECT * FROM tab_name t2 
              WHERE t1.group_id = t2.group_id 
                 AND (t2.status = "inactive" OR t2.group_id = 0))
于 2013-06-28T09:22:18.820 に答える
0

DISTINCTおそらくクエリを少し調整して、代わりに使用する必要があると思いますGROUP BY

これを試して:

select a_id from tab_name where group_id<>0 and group_id in 
(select distinct group_id from tab_name where status="inactive")
于 2013-06-28T09:24:07.043 に答える