2012-04-11 3 views
-1

Я довольно глупый (!), Но не могу найти лучший способ написать запрос для mysql и подумал, что я разместил его здесь, чтобы узнать, может ли кто-нибудь помочь (fyi я использую PHP). У меня есть 5 столов:Как объединить два mysql-запроса эффективно, чтобы возвращать соответствующие записи?

TUsers (ID, Name) 
TJobTypes (ID, Name) 
TJobs (ID, JobTypeID, JobName) 
TJobsRequested (ID, JobID, UserID) 
TJobsOffered (ID, JobID, UserID) 

FYI TJobsTypes к TJobs является один ко многим.

Пользователи могут искать рабочие свопы на основе заданий, которые они могут выполнять, и рабочих мест, которые необходимы/предлагаются. Поэтому, если User1 ищет и говорит, что ему нужно «JobA» и он может предлагать «JobB», а User2 указан как «JobB» и может предложить «JobA», тогда это будет совпадение. Если User2 требует JobB, но не может предложить JobA, это не соответствует. Достаточно легко написать запрос, чтобы он соответствовал этому правилу, однако пользователи также должны иметь возможность поиска на основе общего типа задания (в отличие от конкретных заданий).

Так что, если UserA ищет: «требуется JobTypeA» и «может предлагать JobTypeB», то совпадениями должны быть все пользователи, у которых есть работа, предлагаемая в категории JobTypeA, и имеет задание, занятое в категории JobTypeB (если это имеет смысл!)

Если вы просто ищете один способ раунд (например, показать всех пользователей, которые перечислены в качестве нуждающихся в работу в JobType = $ typecanhelp), то это очень легко и может быть сделано подобное:

SELECT DISTINCT TUsers.Fid, TUsers.FUsername, TUsers.FGender 
FROM TUsers, TJobsRequested, TJobs, TJobTypes 
WHERE TJobTypes.Fid='$typecanhelp' 
AND TJobs.FJobTypeID=TJobTypes.Fid 
AND TJobs.Fid=TJobsRequested.FJobID 
AND TUsers.Fid=TJobsRequested.FUserID 
ORDER BY TUsers.Fid 

ИЛИ (для отображения всех пользователей, которые указаны как предлагающие работу с JobType = $ typeneedhelp):

SELECT DISTINCT TUsers.Fid, TUsers.FUsername, TUsers.FGender 
FROM TUsers, TJobsOffered, TJobs, TJobTypes 
WHERE TJobTypes.Fid='$typeneedhelp' 
AND TJobs.FJobTypeID=TJobTypes.Fid 
AND TJobs.Fid=TJobsOffered.FJobID 
AND TUsers.Fid=TJobsOffered.FUserID 
ORDER BY TUsers.Fid 

Я не могу как-то разобраться, как объединить их вместе, поскольку они используют одни и те же базовые таблицы (TJobs и TJobTypes). Может ли кто-нибудь указать мне в правильном направлении, как объединить два вышеуказанных запроса, чтобы он возвращал пользователям, которые предлагают работу с JobType == $ jobcanhelp, и нужны задания, выполняемые с JobType = $ jobsneedhelp?

+0

Я считаю 5 таблиц, а не 4. –

+0

Поддерживает ли mysql (нерекурсивный) CTE? – wildplasser

+0

@SalmanA: Вы правы, я положил 4 вместо 5, я обновил это :) – deshg

ответ

-1

Если я правильно понял, вы хотите сделать INTERSECT, который, как я думаю, не поддерживается mysql. Похоже, вы можете использовать INNER JOIN, чтобы выполнить то же самое с mysql. Взгляните на this similar question или this page для получения дополнительной информации.

+0

Будет ли это не просто перечислять результаты обоих запросов в одном результирующем наборе, а не только возвращать результаты, соответствующие тем и другим (т.е. пользователям, у которых есть соответствующий запрос на работу и соответствующее предложение о работе)? Или я схожу с ума? :) – deshg

+0

Извините, я неправильно понял ваш вопрос. Я изменил свой ответ на основе вашего комментария. Надеюсь, поможет. –

+0

Большое спасибо за ваш ответ, но я не прав, думая, что при использовании INNERJOIN вам нужно вставить INNERJOIN 2 таблицы в предложение FROM на основе определенных столбцов, которые вы затем можете использовать вместе (например, SELECT a.member_id, a. name FROM INNER JOIN b USING (member_id, имя))? Вместо того, чтобы просто объединить два вопроса, как вы это делали? Я попробовал запрос в любом случае, но это ошибки, и отдельные запросы работают нормально, но не так, как это. Я что-то упускаю :)? – deshg

Смежные вопросы