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

Кощей

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 "поле_услуга" = "номер услуги"

подойдет?
 

Кощей

if(!$needle) die("ooh");
-Ронин-
нет совсем не то

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

-~{}~ 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
 

Андрейка

Senior pomidor developer
Кощей
убери подзапросы (они тебе зрение портят) и посмотри что за фигня получилась
потом, када починишь, перейди к его упрощению... чет все таак сложно
 

Bitterman

Новичок
вот здесь обсуждался ИМХО похожий запрос
http://phpclub.ru/talk/showthread.php?s=&threadid=97248&rand=34

Правда логическое условие тут обратное. Тебе надо найти пользователей, у которых есть данная услуга, а тут получится где нет данной услуги. Но я надеюсь, что ты сможешь подправить запрос сам.
 

-Ронин-

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

Кощей

if(!$needle) die("ooh");
Напишу просто:

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


таблица users_services:
user_id
idservice

таблица services
idservice
idcategory
 

Кощей

if(!$needle) die("ooh");
A-Lex[FM]
если использовать UNION то выведет пользователей у которых есть хоть по одной услуги из любой категории,а мне нужно тех у кого хоть по одной из каждой
 

Bitterman

Новичок
Какой еще UNION?! Чего вы тут городите?!
Кощей
Ты смотрел ссылку, которую я дал? Тебе не показалось, что задача практически та же самая?
 

Кощей

if(!$needle) die("ooh");
Bitterman
смотрел конечно, есть разница

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

Bitterman

Новичок
Кощей
То есть категорий может быть несколько? В первом посте, насколько я понял, речь шла об одной.
Тем не менее, если говорить об одной категории, то все отличие состоит в том, что тебе нужно отобрать вопросы на которые пользователь ответил, а не наоборот. То есть поставить обратное условие. Так?
 

Bitterman

Новичок
Кощей
Соответственно, ты можешь написать запрос, который бы возвращал тебе нужных пользователей, но только для одной заданной категории?
 

Кощей

if(!$needle) die("ooh");
Bitterman
я до этой темы имел такой запрос уже:
SELECT DISTINCT user_id FROM `users_services`
WHERE `idservice` IN (SELECT `idservice` FROM `services` WHERE `idcat` = '2')

выведет всех пользователей у которых есть услуга категории 2
 

Bitterman

Новичок
Кощей
Если у тебя уже есть работающий запрос, то чего ты тогда хочешь? Ты не можешь написать условие, чтобы он выбирал по нескольким категориям?
 

Кощей

if(!$needle) die("ooh");
Bitterman
Это не работающий запрос, это запрос на одну категорию задача выбрать тех у кого по одной в каждой категории
 

Bitterman

Новичок
Кощей
Да, сделать запрос для нескольких категорий сложнее, чем казалось. Честно говоря, единственное, что пока приходит в голову - выбрать из двух таблиц юзеров и категории, сгруппировать по юзерам и посчитать число различных категорий для каждого. После этого сравнить с общим числом категорий (в запросе или уже в пхп). Не проверял, но должно работать, по идее. Хотя выглядит как-то кривовато...
 

chira

Новичок
вернёт юзеров у которых в каждой из четырёх категорий 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
 
Сверху