Reputation: 31
I need some help with a MySQL (5.6) query. I'm not sure how to begin.
I have a table "blades". This table contains blade server records, including the following columns:
Each enclosure holds 16 blades servers in bays 1-16.
I have another table "available_bays". This table contains the following columns:
I need a query that will scan through the blades table and for each enclosure that has less than 16 blades, write a row to the available_bays table with enclosure_name and bay_number. The used enclosure bays may not be consecutive. In other words, the servers in enclosure1 may be in bays 1-8, 10, 13-16. So in this example, I would need to end up with the following records in the available_bays table:
enclosure_name bay_number
enclosure01 9
enclosure01 11
enclosure01 12
Also, it would need to insert the record in the available_bays table only if the same enclosure_name and bay_number do not already exit.
Any help on creating this query would be greatly appreciated.
Upvotes: 0
Views: 121
Reputation: 6202
sqlFiddle is an example here I am only generating available_bays for the first 3 bays, you can add in the the UNION SELECT 4
and so on up to 16.
INSERT INTO available_bays(enclosure_name,bay_number)
SELECT t3.enclosure_name,t3.bay_number
FROM
(SELECT enclosure_name,bay_number FROM
( SELECT 1 as bay_number
UNION SELECT 2
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
UNION SELECT 6
UNION SELECT 7
UNION SELECT 8
UNION SELECT 9
UNION SELECT 10
UNION SELECT 11
UNION SELECT 12
UNION SELECT 13
UNION SELECT 14
UNION SELECT 15
UNION SELECT 16)as t,
(SELECT DISTINCT enclosure_name FROM blades)as t2
)as t3
LEFT JOIN blades b
ON (b.bay_number = t3.bay_number AND b.enclosure_name = t3.enclosure_name)
LEFT JOIN available_bays ab
ON (ab.bay_number = t3.bay_number AND ab.enclosure_name = t3.enclosure_name)
WHERE b.bay_number IS NULL
AND ab.bay_number IS NULL;
Upvotes: 1