Group by with union mysql select query

MysqlSqlGroup ByUnion

Mysql Problem Overview


(SELECT COUNT(motorbike.`owner_id`) as count,owner.`name`,transport.`type` FROM transport,owner,motorbike WHERE transport.type='motobike'
AND owner.`owner_id`=motorbike.`owner_id`
AND transport.`type_id`=motorbike.`motorbike_id` GROUP BY motorbike.owner_id)
UNION ALL
(SELECT COUNT(car.`owner_id`) as count,owner.`name`,transport.`type` FROM transport,owner,car WHERE transport.type='car'
AND owner.`owner_id`=car.`owner_id`
AND transport.`type_id`=car.`car_id` GROUP BY car.`owner_id`)

The query above returns a result like this below,

count          name
1              Linda
2              Mary
1              Steve
1              Linda

This query is to count how many transport that owned by an owner. Linda have one car and one motorcycle,so the result should:

count          name
2              Linda
2              Mary
1              Steve

I have tried this query,but return error:

(SELECT COUNT(motorbike.`owner_id`),owner.`name`,transport.`type` FROM transport,owner,motorbike WHERE transport.type='motobike'
AND owner.`owner_id`=motorbike.`owner_id`
AND transport.`type_id`=motorbike.`motorbike_id`)
UNION ALL
(SELECT COUNT(car.`owner_id`),owner.`name`,transport.`type` FROM transport,owner,car WHERE transport.type='car'
AND owner.`owner_id`=car.`owner_id`
AND transport.`type_id`=car.`car_id`)  GROUP BY motorbike.owner_id

Can anyone help me please?

Mysql Solutions


Solution 1 - Mysql

select sum(qty), name
from (
	select count(m.owner_id) as qty, o.name
	from transport t,owner o,motorbike m
	where t.type='motobike' and o.owner_id=m.owner_id
		and t.type_id=m.motorbike_id
	group by m.owner_id

	union all

	select count(c.owner_id) as qty, o.name,
	from transport t,owner o,car c
	where t.type='car' and o.owner_id=c.owner_id and t.type_id=c.car_id
	group by c.owner_id
) t
group by name

Solution 2 - Mysql

This may be what your after:

SELECT Count(Owner_ID), Name
FROM (
	SELECT M.Owner_ID, O.Name, T.Type
	FROM Transport As T, Owner As O, Motorbike As M
	WHERE T.Type = 'Motorbike'
	AND O.Owner_ID = M.Owner_ID
	AND T.Type_ID = M.Motorbike_ID
	
	UNION ALL
	
	SELECT C.Owner_ID, O.Name, T.Type
	FROM Transport As T, Owner As O, Car As C
	WHERE T.Type = 'Car'
	AND O.Owner_ID = C.Owner_ID
	AND T.Type_ID = C.Car_ID
)
GROUP BY Owner_ID

Solution 3 - Mysql

Try this EDITED:

(SELECT COUNT(motorbike.owner_id),owner.name,transport.type FROM transport,owner,motorbike WHERE transport.type='motobike' AND owner.owner_id=motorbike.owner_id AND transport.type_id=motorbike.motorbike_id GROUP BY motorbike.owner_id)

UNION ALL

(SELECT COUNT(car.owner_id),owner.name,transport.type FROM transport,owner,car WHERE transport.type='car' AND owner.owner_id=car.owner_id AND transport.type_id=car.car_id GROUP BY car.owner_id)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1103332View Question on Stackoverflow
Solution 1 - MysqlMichał PowagaView Answer on Stackoverflow
Solution 2 - MysqlMatt DonnanView Answer on Stackoverflow
Solution 3 - MysqlAuthman ApatiraView Answer on Stackoverflow