2017-06-06 24 views
0

オブジェクト3にはゼロを超える属性(a3)が1つあるため、結果として1が得られるはずです。私はグループ化しようとしましたが、うまく動作しませんでした。MySQL JOINとGROUP BY

削減声明

SELECT COUNT(IF(a3 > 0, TRUE, NULL)) AS a3 
FROM objects AS o 
LEFT JOIN attribs AS a ON o.id=a.oid 
LEFT JOIN group_ref AS gx ON gx.oid = o.id 

削減テーブル

attribs 
------------ 
oid | attrib | value 
------------------------ 
1 | a1 | 3 
2 | a2 | 0 
3 | a3 | 1 


objects 
------------ 
id | title 
------------ 
1 | obj1 
2 | obj2 
3 | obj3 


groups 
------------ 
id | title 
------------ 
1 | g1 
2 | g2 
3 | g3 



group_ref 
------------ 
gid | oid 
------------ 
1 | 1 
1 | 2 
2 | 1 
3 | 3 
3 | 2 
3 | 1 

答えて

0

は、あなたが望むものをこのありませんか?

SELECT COUNT(*) AS a3 FROM attribs WHERE attrib = a3 HAVING value > 0 
+0

基本的な構造は、実際のクエリがはるかに大きいので、滞在しています。 – Mike

0

おそらく、この

drop table if exists a1,o1,g1,gr1; 

create table a1(oid int, attribute varchar(20), value int); 
insert into a1 values 
(1 , 'a1' , 3), 
(2 , 'a2' , 0), 
(3 , 'a3' , 1); 

create table o1(id int, title varchar(10)); 
insert into o1 values 
(1 , 'obj1'), 
(2 , 'obj2'), 
(3 , 'obj3'); 

create table g1(id int, title varchar(20)); 
insert into g1 values 
(1 , 'g1'), 
(2 , 'g2'), 
(3 , 'g3'); 

create table gr1(gid int, oid int); 
insert into gr1 values 
(1 , 1), 
(1 , 4), 
(2 , 1), 
(3 , 3), 
(3 , 4), 
(3 , 1); 

SELECT o1.id,a1.attribute, 
     max(case when gr1.oid is not null then 1 else 0 end) as obs 
FROM o1 
LEFT JOIN a1 ON o1.id=a1.oid 
LEFT JOIN gr1 ON gr1.oid = o1.id 
group by o1.id,a1.attribute; 

結果

+------+-----------+------+ 
| id | attribute | obs | 
+------+-----------+------+ 
| 1 | a1  | 1 | 
| 2 | a2  | 0 | 
| 3 | a3  | 1 | 
+------+-----------+------+ 
3 rows in set (0.00 sec) 
+0

何とか正しい結果を得られない – Mike

+0

あなたの書き起こしたコードを教えてもらえますか? –