• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Abfrage verschluckt Einträge (wird nicht alles angezeigt)

Animal21

Neues Mitglied
Hallo Leute,
meine Abfrage ist etwas komplexer und leider werden im Ergebnis nicht die erwarteten Zeilen ausgegeben.
Es müssten eigentlioch 10 Zeilen ausgegeben werden, allerdings erscheint nur die erste.
Ich vermute daher einfach, das meine Abfrage nicht richtig ist xD

Zum Sachverhalt:
Ich habe 5 Tabellen, die den Sachverhalt zu Bewerbungsangeboten und aktuellen bewerbern speichern:

1. Tabelle: al_applications
- id (primärschlüssel)
- jbgID (fremdschlüssel zur bewerbungenTabelle (wo die bewerbungsanzeigen gespeichert sind))
- status (fremdschlüssel zum status der bewerbung (new/gelesen/weitergeleitet))

2. Tabelle: al_application_status
- id (primärschlüssel)
- name

3. Tabelle: al_com_jobboard_ground (aktuelle bewerbungsangebote)
- id (primärschlüssel)
- departmentID (fremdschlüssel zum department, der die bewerbungsanzeige angehört)

4. Tabelle: al_departments
- id (primärschlüssel)
- name

5. Tabelle: al_l10n_jobboard_ground (sprachtabelle für die bewerbungen der anzeigen)
- id (primärschlüssel)
- langID (fremdschlüssel zur sprache)
- comID (fremdschlüssel zur bewerbungsanzeige)

so, aus diesem 5 tabelle müssen nun bestimmte daten in einer webansicht präsentiert werden.
Die abfrage dazu, hab ich hier (nur leider, zeig diese nur die 1. zeile an)
Code:
select A.id as AID, A.jbgID as AJID, A.name as aName, email, phone, A.date as aDate, xmlPath, S.name as aStatus, position, D.name as department 
from al_applications A, al_application_status S, al_com_jobboard_ground J, al_l10n_jobboard_ground  L, al_departments D 
where status=1 
and S.id=A.status 
and J.id=L.comID 
and L.langID=1 
and J.id=A.jbgID 
and J.departmentID=D.id 
order by status asc, aDate desc, A.name asc;

Folgende abfrage funktioniert noch einwandfrei und zeigt mir alle 10 datensätze an:
Code:
select A.id as AID, A.jbgID as AJID, A.name as aName, email, phone, A.date as aDate, xmlPath, S.name as aStatus 
from al_applications A, al_application_status S 
where status=1 
and S.id=A.status 
order by status asc, aDate desc, A.name asc

Doch sobald ich anfange, die tabellen für die Bewerbungsanzeigen mit den aktuellen bewerbungen zu kombinieren, komm ich nicht wirklich weiter : (

ich hoffe ihr könnt mir helfen.

mfg
ani
 
Also, du müsstest durch Hinzufügen und Weglassen identifizieren können, welcher Teil aus der WHERE-Clause für die Einschränkung zuständig ist. Das wäre ein Anfang.

Ich finde ansonsten sowohl die Benennungen der Tabellen und Felder als auch die „Theta-Style“-JOINs ziemlich schwierig zu durchblicken.
 
OK, dann mit joins:
dies liefert die erwarteten 10 Ergebnisse:
Code:
select A.id as AID, A.jbgID as AJID, A.name as aName, email, phone, A.date as aDate, xmlPath, S.name as aStatus 

from (al_applications as A 
INNER JOIN al_application_status as S 
ON (S.id=A.status and A.status=1)) 

order by status asc, aDate desc, A.name asc

Die nur noch eins:
Code:
select A.id as AID, A.jbgID as AJID, A.name as aName, email, phone, A.date as aDate, xmlPath, S.name as aStatus 

from ((al_applications as A 
INNER JOIN al_application_status as S 
ON (S.id=A.status and A.status=1)) 
[COLOR=#ff0000]INNER JOIN al_com_jobboard_ground as J ON A.jbgID=J.id[/COLOR]) 

order by status asc, aDate desc, A.name asc

Ich find die bezeichnungen der Tabellen eigentlich treffend, vll aber auch nur weil ich sie erstellt habe ^^
1. Tabelle: al_applications (hier werden die tatsächlichen bewerbungen von menschen gespeichert)
- id (primärschlüssel)
- jbgID (fremdschlüssel zur bewerbungenTabelle (wo die bewerbungsanzeigen gespeichert sind))
- status (fremdschlüssel zum status der bewerbung (new/gelesen/weitergeleitet))

2. Tabelle: al_application_status (hier sind nur die 3 status hinterlegt, welche eine bewerbung haben kann [new/gelesen/wetergeleitet])
- id (primärschlüssel)
- name

3. Tabelle: al_com_jobboard_ground (aktuelle bewerbungsangebote, für welche man sich bewerben kann, also die jobs, die offen sind soz.)
- id (primärschlüssel)
- departmentID (fremdschlüssel zum department, der die bewerbungsanzeige angehört)

4. Tabelle: al_departments (hier sind wieder nur die Departmens hinterlegt, welche es im unternehmen gibt)
- id (primärschlüssel)
- name

5. Tabelle: al_l10n_jobboard_ground (sprachtabelle für die bewerbungen der anzeigen, englische/deutsche texte)
- id (primärschlüssel)
- langID (fremdschlüssel zur sprache)
- comID (fremdschlüssel zur bewerbungsanzeige)
 
Vereinfacht und umformatiert also so?

Code:
SELECT
        *
FROM
        al_applications AS A 
INNER JOIN
        al_application_status AS S 
    ON
        A.status = S.id
WHERE
        A.status = 1




SELECT
        *
FROM
        al_applications AS A 
INNER JOIN
        al_application_status AS S 
    ON
        A.status = S.id
INNER JOIN
        al_com_jobboard_ground AS J
    ON
        A.jbgID = J.id
WHERE
        A.status = 1

Falls die Queries passen und die erste 10 Einträge liefert und die zweite nur 1 Eintrag, ist die logische Antwort:

In J existieren keine Entsprechungen für die jeweiligen jbgID-Werte aus A.

Mach aus dem zweiten INNER JOIN testweise einen LEFT JOIN.
 
ok, mit "left join" kommen alle 10, nur das bei 9 davon die hälfte der spalten NULL hat...
Da muss ich wohl meine datensätze mal durchschauen

edit: ach verdammt... alles klar, einige Stellen sind ja bereits besetzt, daher wurden die Bewerbungsanzeigen auch gelöscht. Da kann es ja gar keine entsprecung mehr geben. : (

Danke (mal wieder blind gewesen)
 
Ja, bei einem LEFT JOIN ist sichergestellt, dass alle Datensätze aus der „linken“ Tabelle in der Ergebnismenge auftauchen. Für diejenigen Datensätze, für die es in der verbundenen „rechten“ Tabelle keine Entsprechung gibt (für die die ON-Bedingung nicht erfüllt ist), wird in diesem Fall NULL gesetzt.

Bei einem INNER JOIN schaffen es nur diejenigen Datensätze aus der linken Tabelle in die Ergebnismenge, für die es in der rechten Tabelle tatsächlich eine Entsprechung gibt.
 
Zurück
Oben