Помогите составить запрос на две таблички

Кощей

if(!$needle) die("ooh");
Помогите составить запрос на две таблички

есть две таблички это
категории услуг
услуги

в категории услуг есть три ячейки это номер категории услуги, номер услуги и заголовок

в услугах тоже дае, это номер пользователя и номер услуги

нужно задавая категорию услуги выбрать номера тех пользователей у которых есть хоть одна услуга этой категории

я так делаю
SELECT DISTINCT(user_id) FROM `users_services`
WHERE idservice
IN (SELECT idservice FROM services_cat WHERE idcat=$idcat)

Но это не верно как я понял, таким образом выводит всех пользователей так как все сервисы есть в таблице категорий услуг,а мне нужно выбрать услуги которые есть в категории, затем пользователей у которых есть ети услуги.
 
SELECT "поле_пользваотель" FROM "табл_услуги" WHERE "поле_услуга" = "номер услуги"

подойдет?
 
-Ронин-
нет совсем не то

я свой немного переделал и вышло

-~{}~ 11.03.07 22:52:

Никак немогу сделать, сделал через UNION но так выводит всех пользователей у кго есть хоть какая-то услуга

Вот если так делать:
PHP:
SELECT DISTINCT user_id
FROM `users_services`
WHERE `idservice`
IN (

SELECT `idservice`
FROM `services`
WHERE `idcat` = '2'
)
AND (

SELECT `idservice`
FROM `services`
WHERE `idcat` = '3'
)
AND (

SELECT `idservice`
FROM `services`
WHERE `idcat` = '8'
)
AND (

SELECT `idservice`
FROM `services`
WHERE `idcat` = '9'
)

то при больших попаданиях віводит ошибку:
#1242 - Subquery returns more than 1 row
 
Кощей
убери подзапросы (они тебе зрение портят) и посмотри что за фигня получилась
потом, када починишь, перейди к его упрощению... чет все таак сложно
 
вот здесь обсуждался ИМХО похожий запрос
http://phpclub.ru/talk/showthread.php?s=&threadid=97248&rand=34

Правда логическое условие тут обратное. Тебе надо найти пользователей, у которых есть данная услуга, а тут получится где нет данной услуги. Но я надеюсь, что ты сможешь подправить запрос сам.
 
Кощей
К SELECT добавь INNER JOIN и он выдаст тебе тех у кого что-то есть + получишь дополнительные данные из других таблиц, которые тебе нужно
 
Напишу просто:

Нужно отобрать людей у которых есть хоть по одной услуге из каждой заданой категорий.
есть таблица соответствия: человек->услуга, и есть таблица соответствий услуга->категория


таблица users_services:
user_id
idservice

таблица services
idservice
idcategory
 
A-Lex[FM]
если использовать UNION то выведет пользователей у которых есть хоть по одной услуги из любой категории,а мне нужно тех у кого хоть по одной из каждой
 
Какой еще UNION?! Чего вы тут городите?!
Кощей
Ты смотрел ссылку, которую я дал? Тебе не показалось, что задача практически та же самая?
 
Bitterman
смотрел конечно, есть разница

есть вопросы и нужно отобрать те на которых данный пользователь не ответил, есть только один показатель отбора один пользователь!, мне же нужно иметь возможность задать несколько таких пользователей и выбрать вопросы на которые он неответил, это если брать в пример твою ссылку
 
Кощей
То есть категорий может быть несколько? В первом посте, насколько я понял, речь шла об одной.
Тем не менее, если говорить об одной категории, то все отличие состоит в том, что тебе нужно отобрать вопросы на которые пользователь ответил, а не наоборот. То есть поставить обратное условие. Так?
 
Кощей
Соответственно, ты можешь написать запрос, который бы возвращал тебе нужных пользователей, но только для одной заданной категории?
 
Bitterman
я до этой темы имел такой запрос уже:
SELECT DISTINCT user_id FROM `users_services`
WHERE `idservice` IN (SELECT `idservice` FROM `services` WHERE `idcat` = '2')

выведет всех пользователей у которых есть услуга категории 2
 
Кощей
Если у тебя уже есть работающий запрос, то чего ты тогда хочешь? Ты не можешь написать условие, чтобы он выбирал по нескольким категориям?
 
Bitterman
Это не работающий запрос, это запрос на одну категорию задача выбрать тех у кого по одной в каждой категории
 
Кощей
Да, сделать запрос для нескольких категорий сложнее, чем казалось. Честно говоря, единственное, что пока приходит в голову - выбрать из двух таблиц юзеров и категории, сгруппировать по юзерам и посчитать число различных категорий для каждого. После этого сравнить с общим числом категорий (в запросе или уже в пхп). Не проверял, но должно работать, по идее. Хотя выглядит как-то кривовато...
 
вернёт юзеров у которых в каждой из четырёх категорий 2,3,5,7 есть один и больше сервисов
Код:
SELECT us.user_id
FROM users_services us
, services_cat sc
WHERE us.idservice = sc.idservice
  AND sc.idcat IN (2,3,5,7)
GROUP BY us.user_id
HAVING COUNT(DISTINCT sc.idcat) = 4 -- 4 категории: 2,3,5,7
 
Сверху