SELECT t.id, COUNT(*), SUM(t.ct)
FROM (SELECT l.id, y.value, COUNT(*) as ct
FROM links l
INNER JOIN history_yap y ON l.link_id = y.link_id
GROUP BY l.id, y.value) t
GROUP BY t.id
UNION ALL
SELECT l.id, -1, -1
FROM links l
LEFT JOIN history_yap y ON l.link_id = y.link_id
WHERE y.id IS NULL;
Логика почти та же, но во внутреннем запросе мы также считаем сколько всего было записей в links X history_yap. Также добавлен второй запрос на ссылки без каких либо записей в history_yap. В результате имеем таблицу с тремя колонками:
* link.id - искомое
* количество уникальных значений. Если -1, то в history_yap для этого links.id не было ни одной записи. Если больше 1, то есть минимум два history_yap для этой ссылки с разными значениями. Если 1, то смотрим на третью колонку.
* количество строк в links X history_yap для каждого links.id. Если во второй колонке 1 и в третьей колонке 1, то для этого links.id есть всего одна запись history_yap. Все остальные значения игнорируем.
P.S. ответил новым постом, т.к. в комментариях код не добавить.