select t.*
from
(
select
c1.user_id as uid,
c1.contact_id as cid
from contacts c1
outer join contacts c2 on c1.id=c2.id
where c1.user_id=x and c2.user_id=y
) t
where t.uid = х
;
romy4:
Having используется с агрегатными функциями, коих я в вашем запросе не вижу. Без агрегатных функций это будет обычный where. И кстати работать будет не во всех базах данных, например в Oracle будет ошибка.
Сергей Еремин:
я имел ввиду CROSS JOIN между t1 и t2, будет полное декартово произведение:
Ящик | Огурцы
Ящик | Молоко
Ящик | Туалетная бумага
Корзинка | Огурцы
Корзинка | Молоко
Корзинка | Туалетная бумага
и тд
потом соединить с table_link и если - Ящик | Туалетная бумага - нет в table_link, количество будет null, как то так:
Ящик | Туалетная бумага | null
sunrails:
INNER JOIN используется с условием ON, соответственно возвращаются строки удовлетворяющие условию указанному в ON.
Я понимаю что вы хотите сделать, но называется это - CROSS JOIN.