Ich habe 5 Tabellen:Wie schreibe ich eine Abfrage, um Datensätze mit mehreren Einschränkungen und Übereinstimmungen zu zählen?
- Dateien
- Stichworte
- join_File_Tags
- Profile
- join_Profile_Tags
Die Profile und die join_Profile_Tags Tabellen bestimmen, die sehen kann ein Benutzer Dateien.
Daten könnte wie folgt aussehen:
- File1 hat Tags One, Drei
- File2 hat Tags One, Fünf
- File3 hat Markierungen One, Drei, Sechs
- Profile1 Zugriff auf Variablen Zwei, Drei, Vier
- Profile2 hat Zugriff auf Tags One, Zwei hat, Drei, Vier, Fünf
brauchte ich eine Abfrage, die die Dateien zurückgibt, dass alle ihre Tags in einem Profil-Liste der Tags entsprechen.
Und ich kam mit dieser:
SELECT
files.id,
files.FileName,
(SELECT COUNT(j_file_tags.id) from j_file_tags WHERE j_file_tags.fileID = files.id) as fileTagCount
FROM files
LEFT JOIN j_file_tags ON j_file_tags.fileID = files.id
LEFT JOIN tags ON tags.id = j_file_tags.tagID
WHERE
files.caseID = '123456'
AND
j_file_tags.tagID IN ("One, Two, Three, Four, Five") /* i can get these before hand */
GROUP BY
files.id
HAVING
COUNT(j_file_tags.id) = fileTagCount /* this makes sure that the user has access to ALL the tags applied to the file*/
Das gibt mir genau das, was ich brauche. ABER was ich versuche, jetzt zu bekommen ist: Wie viele Dateien gibt es in jedem Tag?
So in meinem Beispiel Daten an der Spitze, der Profile2 Benutzer File1 und File2 aber nicht File3 sehen, weil das ein Tag hat sechs, die profile2 keinen Zugang zu. Ich brauche eine Abfrage, die eine Tag Cloud erstellt (kein Biggie basierend auf der Tabelle j_profile_tags), aber ich brauche die Tags, um die Anzahl der Dateien einzuschließen. Ich brauche Tag One, um die Nummer 2, Drei zeigt 1, Five zeigt 1 zu zeigen.Die Abfragen, die ich bisher versucht habe, enthalten die Anzahl aller Dateien. Daher wird Tag One mit einer Anzahl von 3 angezeigt, obwohl Profile2 keinen Zugriff auf diese dritte Datei hat. Hier ist meine halbe Arbeits query:
SELECT
tags.id,
tags.TagName,
COUNT(tags.id) as tagCount
FROM
tags
INNER JOIN j_file_tags ON tags.id = j_file_tags.tagID
INNER JOIN files ON j_file_tags.fileID = files.id
INNER JOIN j_profile_tags ON j_profile_tags.tagID = tags.id AND j_profile_tags.profileID = 'Profile2'
WHERE
files.caseID = '123456'
GROUP BY
tags.id
Wenn LEFT JOIN, setzen Sie die Bedingungen der rechten Seitentabelle in die ON-Klausel, um echtes linkes Join-Verhalten zu erhalten. (Wenn in WHERE, erhalten Sie innere Join-Ergebnis ...) – jarlh
Ich aktualisiert die INNER JOIN in meiner letzten Abfrage, wie Sie vorgeschlagen. –
I Kommentar war eher in Bezug auf Ihre erste Abfrage, die mit LEFT JOIN's. – jarlh