Вся ваша структура структурирована неправильно, вы не можете предполагать, что два результата будут идеально совмещены, а ваши циклы ошибочны. Попробуйте это:
SELECT *,
(case when id IN
(SELECT catid FROM item_categories WHERE itemid = '$itemid')
then 1 else 0 end) checked
FROM categories ORDER BY cname
Теперь вы просто запускаете один запрос и у вас есть небольшой $row['checked']
для использования!
SELECT *,
(case when categories.id IS NOT NULL
then 1 else 0 end) checked
FROM item_categories
LEFT JOIN categories
ON (item_categories.catid = categories.id)
WHERE itemid = '$itemid'
Улучшено на основе гибрида между марком B и моим ... Единственная разница в эффективности заключается в том, что запрос обрабатывает проверку достоверности category.id вместо php