I am trying to make an after insert trigger that will add the bnumber to the table available with the rack-id that has the most open slots. To get this I need to take the total number of slots – the number of instances and if there are no free slots then the insert will fail. Below is what I have came up with so far but I don not know if it is at all correct and right now it throws 1111: Invalid use of Group function.
BEGIN
insert into
Available
SELECT new.bnumber,max('y.rack-id')
From (select count(*) as 'Available.rack-id'
from Available inner join Rack
group by 'Available.rack-id'
) y
where max(y.rack-id) > 0;
END
updated non error code but is not inserting anything into the table Available
insert into Available
SELECT new.bnumber,max('y.rack-id')
From
(select count(*) as 'Available.rack-id'
from Available inner join Rack on 'Rack.rack-id' = 'Available.rack-id'
group by 'Available.rack-id'
) y
having max('y.rack-id') > 0;
Tables:
CREATE TABLE `Bike` ( `bnumber` int NOT NULL, `make` varchar(64) DEFAULT NULL, `color` varchar(8) DEFAULT NULL, `year` int DEFAULT NULL, PRIMARY KEY (`bnumber`) ) CREATE TABLE `Rack` ( `id` int NOT NULL, `location` varchar(256) DEFAULT NULL, `num-holds` int DEFAULT NULL, PRIMARY KEY (`id`) ) CREATE TABLE `Available` ( `bnumber` int NOT NULL, `rack-id` int DEFAULT NULL, PRIMARY KEY (`bnumber`), KEY `bnumber_idx` (`rack-id`), KEY `bnumber_idx1` (`bnumber`), CONSTRAINT `bnumber` FOREIGN KEY (`bnumber`) REFERENCES `Bike` (`bnumber`), CONSTRAINT `rack-id` FOREIGN KEY (`rack-id`) REFERENCES `Rack` (`id`) ) Bike bnumber,make,color,year '1', muller, yellow, 2017 '2', muller, green, 2018 '3', muller, red, 2020 Rack id,location,num-holds (num-holds is the number of empty slots) '0', 'Louisville', '3' '1', 'Clarksville', '4' Available bnumber,rack-id '1', '0' '2', '0' '3', '1'
so in this examples when you add a new bike it will be something like bnumber 4. It will then get the count of instances of rack-id so 2 instances of rack-id 0 and 1 instance of rack-id 1. Then it will subtract the the instances from the corresponding num-holds. so this step would be rack-id 0 has 3 num-holds - 2 instances = 1 empty slot available. rack-id 1 has 4 num-holds - 1 instance = 3 empty slots, so bnumber 4 would be inserted into rack with the rack-id 1.
Advertisement
Answer
First, you are missing a ON clause:
from Available inner join Rack
it will look something like this:
ON Available.col = Racl.col
Then, in your outer query:
insert into Available
SELECT new.bnumber
,max('y.rack-id')
From
(
) y
where max(y.rack-id) > 0;
You are missing a GROUP BY new.bnumber and also HAVING clause is use instead WHERE when you need to filter by aggregation.
DECLARE rowcount INT;
select count(*)
INTO rowcount
from Available inner join Rack
on 'Rack.rack-id' = 'Available.rack-id'
group by 'Available.rack-id'
ORDER BY 'rack-id'
LIMIT 1;
insert into Available ('bnumber','rack-id')
SELECT new.bnumber, rowcount