As you test data contained only a menu that was a perfect match to the test order and a menu that contained everything I added a couple of extra menus and orders.
SELECT m.menu_id
, m.menu_name
, COUNT(*) as matched
, ROUND(count(*)/menuitems*100, 1) as `%menu`
, ROUND(count(*)/orderitems*100, 1) as `%order`
FROM
ssm_menu m
INNER JOIN
ssm_menu_connection c
ON c.menu_id = m.menu_id
INNER JOIN
ssm_menu_order o
ON o.menu_item_id = c.menu_item_id
INNER JOIN
(
SELECT job_id
, COUNT(DISTINCT menu_item_id) as orderitems
FROM ssm_menu_order
GROUP BY job_id
) jtot ON jtot.job_id = o.job_id
INNER JOIN
(
SELECT menu_id
, COUNT(DISTINCT menu_item_id) as menuitems
FROM ssm_menu_connection
GROUP BY menu_id
) mtot ON m.menu_id = mtot.menu_id
WHERE o.job_id = 27
GROUP BY m.menu_id
ORDER BY matched DESC, `%menu` DESC, `%order` DESC;
+---------+----------------------------------------------------------+---------+-------+--------+
| menu_id | menu_name | matched | %menu | %order |
+---------+----------------------------------------------------------+---------+-------+--------+
| 1 | Menu One | 3 | 100.0 | 100.0 |
| 2 | Private Dinner Party/Wedding - 3 Course Fine Dining Menu | 3 | 18.8 | 100.0 |
| 3 | Menu Three | 2 | 66.7 | 66.7 |
| 4 | Menu Four | 2 | 50.0 | 66.7 |
| 5 | Menu Five | 1 | 25.0 | 33.3 |
+---------+----------------------------------------------------------+---------+-------+--------+