Я довольно глупый (!), Но не могу найти лучший способ написать запрос для 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?
Я считаю 5 таблиц, а не 4. –
Поддерживает ли mysql (нерекурсивный) CTE? – wildplasser
@SalmanA: Вы правы, я положил 4 вместо 5, я обновил это :) – deshg