MySQL Abfrage Tabelle 1 nur wenn in 2

Hammurabi

Mitglied
Guten Morgen,

also ich benötige eine Abfrage die mir aus der Tabelle1 die ID gibt aber halt nur dann wenn aus Tabelle1 der Status passt und/oder in Tabelle2 die ID schon vorhanden ist. Ich könnte zwar jetzt alles mit PHP umschreiben aber das wäre ja eine menge Quellcode und den will ich vermeiden und da ich mich in MySQL nicht so gut auskenne wollte ich mal frage ob und wie man so etwas realisieren kann.

EDIT:
SQL:
SELECT applications.applicantID, applications.name  FROM applications, empf WHERE applications.firmID='$_SESSION[user_fid]' AND (applications.status='intresst' or applications.status='processing' or empf.viewID=applications.viewID)
Gut das macht jetzt zwar genau das was ich machen will allerdings dauert diese anfrage sehr lange hätte da jemand einen tip?
 
Zuletzt bearbeitet:
Hallo,

ohne jetzt deine Tabellendatenmengen zu kennen:

Die Verwendung von OR in Kombination mit JOINs solltest du soweit es geht versuchen zu vermeiden. Versuche lieber auf einzelne (simple) Abfragen herunterzubrechen und das ganze dann wieder zu mergen (z.B. per UNION). Der Mergeaufwand sollte sich dabei in Grenzen halten. Wenn Duplikate kein Problem sind, ist eher UNION ALL zu empfehlen. An der ersten Stelle ist die Verwendung von IN anstelle von a OR b usw. zu empfehlen.

Ein Beispiel wie man deine Query umschreiben könnte:

SQL:
SELECT applications.applicantID, 
       applications.name 
  FROM applications
 WHERE firmID='$_SESSION[user_fid]' 
   AND status IN ('interest', 'processing')
UNION
SELECT applications.applicantID, 
       applications.name 
  FROM applications INNER JOIN empf
    ON applications.viewId = empf.viewID

Ansonsten:

- Wieviele Datensätze hast du in den beiden Tabellen ?
- Wie ist die Relation der Tabelle applications zu empf ?
- Hast du die Tabellen indifziert, wenn ja, welche Spalten (SHOW INDEX FROM <table>)

Markus
 
Danke für die schnelle Antwort werde ich gleich mal testen ob es schneller geht.

Ansonsten:

- Wieviele Datensätze hast du in den beiden Tabellen ?
- Wie ist die Relation der Tabelle applications zu empf ?
- Hast du die Tabellen indifziert, wenn ja, welche Spalten (SHOW INDEX FROM <table>)

Markus
1.
Tabelle „applications“ ca. 9000 Datensätze und steigend
Tabelle „empf“ ca. 2000 Datensätze und steigend
2.
also „applications“ sind viele Leute drin die halt empfohlen werden können und wenn jemand empfohlen wurde steht das mit seiner ID und zu wem usw. in „empf“ allerdings brauche ich für die abfrage ja nur zu wissen ob er schon mal empfohlen wurde (könnte auch mehrmals sein)
3.
Tabellen identifiziert was ist das?
 
Ok,

zu 3. Es muss natürlich indiziert heissen ;-) D.h. ob du Indizes hast auf deinen Tabellen.

Also wenn du sagst, dass die Applicant-ID in der "empf" Tabelle direkt enthalten ist, was beschreibt dann die viewID in beiden Tabellen? :

Ich seh grad, die Einschränkung auf die Firmen-ID ist unter den Tisch gefallen in der 2.Teilabfrage:

SQL:
<1. Teil der Abfrage >
UNION 
 SELECT applicationId
   FROM applications, empf
  WHERE applications.firmID  = '$_SESSION[user_fid]' 
    AND applications.viewID  = empf.viewID

Oder falls du direkt die Application-ID in der zweiten Tabelle empf hast:

SQL:
<1. Teil der Abfrage >
UNION 
 SELECT applications.applicationId
   FROM applications, empf
  WHERE applications.firmID  = '$_SESSION[user_fid]' 
    AND applications.applicationId  = empf.applicationID

Markus
 
Also die „viewID“ ist das einzige was in den 2 Tabellen übereinstimmt also die Verknüpfung ... und wenn ich deine abfrage so ausführe wie du sie geschrieben hast:
SQL:
SELECT applications.applicantID, applications.name 
FROM applications 
WHERE firmID='$_SESSION[user_fid]' 
AND STATUS IN ('interest', 'processing')
UNION 
SELECT applicationId 
FROM applications, empf 
WHERE applications.firmID = '$_SESSION[user_fid]' 
AND applications.viewID = empf.viewID
dann bekomme ich nichts mehr zurück. Kann es da sein das du erst eines abfragst und dann sozusagen fragst ob bei der Rest menge noch die zweite Sache zutrifft?

Ich verstehe auch nicht ganz was union macht also wenn du das mal kurz schildern könntest wäre ich dir dankbar.
 
Hallo nochmal,

UNION merged sozusagen die beiden Ergebnismengen. In meinem Beispiel suche ich in der oberen Query nach den Datensätzen, die dem Status entsprechend und in der unteren Query nach den Datensätzen, die schon einen Eintrag in der 2.Tabelle, also empf haben.
Sofern Duplikate vorkommen, werden diese entfernt.

Das Problem was du haben könntest ist, dass du mir bei dem eben geposteten Code in der SELECT-Klausel oben noch den "applications.name" dazu genommen hast, das musst du in der unteren Query dann ebenfalls tun. Soll heissen: Die Anzahl an Feldern muss gleich sein und die Datentypen müssen kompatibel sein.

Markus
 
Du bist einfach Spitze(!)

Eine super Erklärung von dir und schnelle hilft es funktioniert alles so wie es solle.

Der fertige Quellcode sieht jetzt so aus:
SQL:
SELECT applications.applicantID, applications.name 
FROM applications 
WHERE firmID='$_SESSION[user_fid]' 
AND applications.status IN ('interest', 'processing')
UNION 
SELECT applications.applicantID, applications.name 
FROM applications, empf 
WHERE applications.firmID = '$_SESSION[user_fid]' AND applications.viewID = empf.viewID
 
Hallo

danke für das Lob :) Freut mich dass es jetzt klappt!
Wäre nett, wenn du das Thema dann noch auf "erledigt" setzt.

Markus
 
Ich muss leider dieses Thema noch mal öffnen, weil ich nun noch mit der Abfrage eine suche realisieren will und mit folgendem Code bekomme ich immer alle Datensätze des Users zurück will ja aber nur die wo "irgentwas" in den berufen vor kommt meine aber daran ist nix auszusetzen?
SQL:
SELECT applications.viewID, applications.okID, applications.applicantID, applications.name, applications.av_notes, applications.vorname, applications.activated, applications.enable, applications.berufsbezeichnung, applications.status 
FROM applications
WHERE applications.berufsbezeichnung LIKE '%trim($_SESSION["word"])%' 
AND applications.firmID='$_SESSION[user_fid]'
$status OR applications.interessen LIKE '%trim($_SESSION["word"])%' 
AND firmID='$_SESSION[user_fid]' $status OR applications.kenntnisse LIKE '%trim($_SESSION["word"])%' 
AND firmID='$_SESSION[user_fid]' $status
UNION 
SELECT applications.viewID, applications.okID, applications.applicantID, applications.name, applications.av_notes, applications.vorname, applications.activated, applications.enable, applications.berufsbezeichnung, applications.status 
FROM applications, empf 
WHERE applications.firmID = '$_SESSION[user_fid]'

Auf der Variablen $status ist gespeichert z.B. "AND applications.status IN ('interest', 'processing')"
 
Hallo nochmal,

ohne jetzt genauer auf die einzelnen Abfrageelemente einzugehen: Du hast 2x ein OR in deiner Klausel hast aber keine Klammerung benutzt um die Reihenfolge festzulegen. Versuch mal die Bedingungen, die zusammen gehören müssen zu klammern und versuch es dann nochmal.

Als weiteres denke ich, dass du dir das UNION in deinem Falle mit der Berufssuche sparen kanns, da du ja eben nur nach der Berufsbezeichnung suchst. Durch die 2.Teilabfrage kommen aber alle "applicants" zu der Firma wieder zur Ergebnismenge dazu.
Darüber hinaus fehlt der JOIN mit der Tabelle empf.

Was noch auffällt ist der Ausdruck "%trim($_SESSION["word"])%". Sicher, dass es so schon mal funktioniert hat?

Markus
 

Neue Beiträge

Zurück