I have 3 MySQL tables: companies
, activities
, association_company_activities
the association_company_activitiestable
links companies
and activities
, so it has 3 fields: 1 auto increment ID
, company_id
as foreing key, and activity_id
as foreing key.
I have this query:
SELECT
C.id,
C.label,
A.name
FROM
companies C
JOIN activities A JOIN association_company_activities S ON
C.identifier = S.company_id AND A.identifier = S.activitiy_id
ORDER BY
C.label
As I'm using a python script, the above query corresponds to this: ( I also return the result as a json )
def search(args, items):
args = request.args.to_dict()
if len(args) > 0:
for param, value in args.iteritems():
items = [v for v in items if v.has_key(param) and v[param] == value]
return items
A = aliased(model.Activity, name='A')
S = aliased(model.AssocCompaniesActivities, name='S')
C = aliased(model.Company, name='C')
activity_area = A.name.label("activities_area")
results = session.query(C.id, C.label, activity_area) \
.join(S) \
.join(A) \
.filter(C.identifier == S.company_id) \
.filter(A.identifier == S.activity_id) \
.order_by(C.label) \
.all()
session.close()
args = request.args.to_dict()
results = search(args, results)
return jsonify({"results": results})
This gives me this:
{
"results": [
{
"activities_area": "luxury",
"id": "company1",
"label": "first company"
},
{
"activities_area": "banks",
"id": "company2",
"label": "second company"
},
{
"activities_area": "paper",
"id": "company2",
"label": "second company"
}
]
}
I want to return the companies with multiple activities only once and get the activity_area as an array like this:
{
"results": [
{
"activities_area": "luxury",
"id": "company1",
"label": "first company"
},
{
"activities_area": [
"paper",
"banks"
],
"id": "company2",
"label": "second company"
}
]
}
THE MODEL:
class Companies(Base):
__tablename__ = 'companies'
identifier = Column(Integer, primary_key=True)
id = Column(String)
label = Column(String)
def __init__(self, id, label):
self.id = id
self.label = label
class Activities(Base):
__tablename__ = 'activities_area'
identifier = Column(Integer, primary_key=True)
name = Column(String)
def __init__(self, name):
self.name = name
class AssocCompaniesActivities(Base):
__tablename__ = 'assoc_companies_activities'
identifier = Column(Integer, primary_key=True)
company_id = Column(Integer, ForeignKey("companies.identifier"), nullable=True)
activities_area_id = Column(Integer, ForeignKey("activities_area.identifier"), nullable=True)
def __init__(self, company_id , activities_area_id):
self.company_id = organization_id
self.activities_area_id = activities_area_id
How to do this ?