http://www.cnblogs.com/CareySon/archive/2011/07/18/2109406.html
select a.alias, a.name, a.bandwidth, count(b.uuid) as cabinet from resource_idc a LEFT OUTER JOIN resource_cabinet b ON a.uuid=b.idc_uuid GROUP BY b.idc_uuid;
--------+--------------+-----------+---------+
| alias | name | bandwidth | cabinet |
+-------+--------------+-----------+---------+
| wxxq | 无锡新区 | 10000 | 4 |
| bjtn | 北京铜牛 | 400 | 1 |
+-------+--------------+-----------+---------+
select a.uuid, a.alias, a.capacity, a.idc_uuid as idc, count(b.subnet_uuid) as subnet from resource_cabinet a LEFT OUTER JOIN cabinet_subnet b ON a.uuid=b.cabinet_uuid GROUP BY b.cabinet_uuid;
+--------------------------------------+----------+----------+--------------------------------------+--------+
| uuid | alias | capacity | idc | subnet |
+--------------------------------------+----------+----------+--------------------------------------+--------+
| 073130e9-64a5-47c3-b032-2d254fe43cd2 | wxxq-b1 | 42 | cec27a7a-0bac-4372-8bc4-954b07cefe46 | 1 |
| 09401e18-89b4-4028-9224-a390e3112dfd | bjtn-g17 | 42 | e9465a14-934e-4ca4-b6da-27ac5b8c07a3 | 2 |
| 4f1b18dd-de22-46e5-938e-2c3eb01876fe | wxxq-b2 | 42 | cec27a7a-0bac-4372-8bc4-954b07cefe46 | 1 |
| 9f763b06-4015-4ddf-900a-7560099fc6b8 | wxxq-b3 | 42 | cec27a7a-0bac-4372-8bc4-954b07cefe46 | 1 |
| cc9818b4-7afe-4fdf-b5fb-978a71994786 | wxxq-b4 | 42 | cec27a7a-0bac-4372-8bc4-954b07cefe46 | 1 |
+--------------------------------------+----------+----------+--------------------------------------+--------+
select a.alias, a.name, a.bandwidth, count(b.uuid) as cabinet, sum(b.subnet) as subnet
from resource_idc as a
LEFT OUTER JOIN
(select a.uuid, a.alias, a.capacity, a.idc_uuid, count(b.subnet_uuid) as subnet from resource_cabinet a LEFT OUTER JOIN cabinet_subnet b ON a.uuid=b.cabinet_uuid group by b.cabinet_uuid) as b
ON a.uuid=b.idc_uuid
GROUP BY b.idc_uuid;
+-------+--------------+-----------+---------+--------+
| alias | name | bandwidth | cabinet | subnet |
+-------+--------------+-----------+---------+--------+
| wxxq | 无锡新区 | 10000 | 4 | 4 |
| bjtn | 北京铜牛 | 400 | 1 | 2 |
+-------+--------------+-----------+---------+--------+
http://stackoverflow.com/questions/25392770/query-many-to-many-in-sqlalchemy
http://pr8x.com/st/questions/29592559/sqlalchemy-filtering-count-in-many-to-many-relationship-query.html
http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#using-subqueries
http://blog.csdn.net/raptor/article/details/48735159
合并行数据
http://stackoverflow.com/questions/26583832/sqlalchemy-group-concat-and-duplicates
sqlalchemy
@mod.route('/api/idc', methods=['GET'])
def get_idc():
total = len(Idc.query.all())
query = Cabinet.query
.join(cabinet_subnet)
.join(Subnet)
.add_columns(Cabinet.uuid, Cabinet.idc_uuid, func.count(Subnet.uuid).label('subnet'))
.group_by(Cabinet.uuid).subquery()
idces = Idc.query
.outerjoin(query, (Idc.uuid==query.c.idc_uuid))
.add_columns(Idc.uuid, Idc.name, Idc.alias, Idc.bandwidth)
.add_columns(Idc.create_datetime, Idc.update_datetime, Idc.update_man)
.add_columns(func.count(query.c.uuid).label('cabinet'), func.sum(query.c.subnet).label('subnet'))
.group_by(query.c.idc_uuid)
.paginate(int(request.args['page']), int(request.args['limit']), False).items
rows = [ {'uuid': idc.uuid, 'alias': idc.alias, 'name': idc.name, 'bandwidth': idc.bandwidth,
'cabinet': idc.cabinet, 'subnet': str(idc.subnet), 'host': '', 'vhost': '', 'net': '', 'other': '',
} for idc in idces ]
results = {
'totalCount': total,
'rows': rows
}
return json.dumps(results)