2012-04-11 4 views
-1

Ich bin ziemlich dumm (!), Aber kann nicht den besten Weg, um eine Abfrage für mysql zu schreiben und dachte, ich würde es hier posten, um zu sehen, ob jemand helfen kann (fyi ich benutze PHP). Ich habe 5 Tabellen:Wie zwei mysql-Abfragen effizient zusammengeführt werden, um übereinstimmende Datensätze zurückzugeben?

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

FYI TJobsTypes zu TJobs ist eine Eins-zu-Beziehung.

Benutzer können nach Job-Swaps suchen, basierend auf Jobs, die sie ausführen können, und Jobs, die benötigt/angeboten werden. Wenn User1 also sucht und sagt, dass er "JobA" machen muss und "JobB" anbieten kann und User2 als JobB aufgeführt ist und "JobA" anbieten kann, dann wäre das eine Übereinstimmung. Wenn User2 JobB benötigt, aber JobA nicht anbieten kann, ist es keine Übereinstimmung. Es ist einfach genug, eine Abfrage zu schreiben, um diese korrekt abzugleichen. Benutzer müssen jedoch auch in der Lage sein, basierend auf dem allgemeinen Jobtyp (im Gegensatz zu bestimmten Jobs) zu suchen.

Wenn also UserA sucht: 'benötigt JobTypeA' und 'kann JobTypeB' anbieten, dann sollten die Matches alle Benutzer sein, die einen Job in der JobTypeA Kategorie haben und einen Job in der JobTypeB Kategorie haben (wenn das Sinn macht!)

Wenn Sie nur einen Weg rund um die Suche (zB zeigen alle Benutzer, die einen Job als um innerhalb Jobtype = $ typecanhelp aufgeführt sind), dann dies ist ganz einfach und kann ähnlich wie geschehen:

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 

ODER (um alle Benutzer anzuzeigen, die einen Job mit JobType = $ typeedhelp anbieten):

Ich kann jedoch nicht herausfinden, wie Sie die beiden zusammenführen, da sie die gleichen Basistabellen (TJobs und TJobTypes) verwenden. Könnte mir jemand in die richtige Richtung zeigen, wie die obigen beiden Abfragen zusammengeführt werden, damit Benutzer zurückgegeben werden, die einen Job mit JobType == $ jobcanhelp anbieten und Jobs mit JobType = $ jobsneedhelp benötigen?

+0

Ich zähle 5 Tabellen, nicht 4. –

+0

Unterstützt MySQL (nichtrekursive) CTEs? – wildplasser

+0

@SalmanA: Sie sind richtig, ich habe 4 anstelle von 5, ich habe dies aktualisiert :) – deshg

Antwort

-1

Wenn ich richtig verstehe Sie wollen eine INTERSECT machen, die ich glaube nicht, wird von MySQL unterstützt. Es scheint, dass Sie INNER JOIN verwenden können, um dasselbe mit mysql zu erreichen. Werfen Sie einen Blick auf this similar question oder this page für weitere Informationen.

+0

Wird dies nicht nur die Ergebnisse beider Abfragen in einer Ergebnismenge auflisten, sondern tatsächlich nur Ergebnisse zurückgeben, die mit beiden übereinstimmen (dh Benutzer, die eine übereinstimmende Jobanfrage und ein passendes Jobangebot haben)? Oder werde ich verrückt? :) – deshg

+0

Sorry, ich habe deine Frage missverstanden. Ich habe meine Antwort basierend auf deinem Kommentar geändert. Ich hoffe es hilft. –

+0

Vielen Dank für Ihre Antwort, aber ich bin nicht richtig in der Annahme, dass wenn Sie ein INNERJOIN verwenden müssen Sie 2 Tabellen innerhalb der FROM-Klausel basierend auf bestimmten Spalten INNERJOIN, die Sie dann zusammen verwenden können (z. B. SELECT a.member_id, a. Name von einem INNEREN JOIN b VERWENDUNG (Mitgliedsname, Name))? Anstatt nur 2 Abfragen zu verknüpfen, wie Sie es getan haben? Ich habe die Abfrage trotzdem ausprobiert, aber es ist fehlerhaft, beide einzelnen Abfragen funktionieren gut, aber nicht zusammen. Fehle ich etwas :)? – deshg

Verwandte Themen