Helpdesk
Menschen Wissenschaft Politik Mystery Kriminalfälle Spiritualität Verschwörungen Technologie Ufologie Natur Umfragen Unterhaltung
weitere Rubriken
PhilosophieTräumeOrteEsoterikLiteraturAstronomieHelpdeskGruppenGamingFilmeMusikClashVerbesserungenAllmysteryEnglish
Diskussions-Übersichten
BesuchtTeilgenommenAlleNeueGeschlossenLesenswertSchlüsselwörter
Schiebe oft benutzte Tabs in die Navigationsleiste (zurücksetzen).

Programmieren: Hilfe & Austausch

920 Beiträge ▪ Schlüsselwörter: Programm, Code, Html ▪ Abonnieren: Feed E-Mail

Programmieren: Hilfe & Austausch

14.09.2012 um 20:45
@AnGSt

Du musst die richtigen Mengen-Kombinationen finden... hier ist aufgeführt, wie das genau funktioniert...

http://www.bjoerns-choice.de/archives/20

Anzeige
melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

14.09.2012 um 20:47
ich denke das man hier einen subquery oder sonst eine verschachtelung braucht, weil der inner join die nachfolgenden left joins evtl beeinflusst?


melden

Programmieren: Hilfe & Austausch

14.09.2012 um 20:51
@AnGSt

Du kannst es damit versuchen aber im Grunde ist das Prinzip simpel

alles vor dem JOIN ist Menge A, alles danach Menge B das gilt dann für Jedes JOIN


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

14.09.2012 um 20:55
Ändert nix und funzt nicht. :|


melden

Programmieren: Hilfe & Austausch

14.09.2012 um 20:56
@AnGSt
Dann frag ganz allgemein ab und verschachtel es.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

14.09.2012 um 20:57
Wie?


melden

Programmieren: Hilfe & Austausch

14.09.2012 um 20:58
Na die Tabelle die du vorher erschaffen hast einfach in den nächsten Querry als Quelle anführen

Select * From ( SELECT ... ) Where Typ = 1 or Typ =2

musst sicher noch was verfeinern


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

14.09.2012 um 20:59
Check ich nicht. :| ^^


melden

Programmieren: Hilfe & Austausch

14.09.2012 um 21:03
@AnGSt
Wenn du deine erste Abfrage durchführst ( nur Outer-Joins, so allgemein wie möglich) bekommst du doch wieder eine Tabelle. Diese Tabelle kannst du genau so abfragen wie jede andere Tabelle und zwar indem du den vorherigen Befehl ganz einfach in einem neuem Befehl da einfügst wo die Tabelle hingehört.

Noch nie nen SQL Befehl verschachtelt? :D


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

14.09.2012 um 21:07
Nur mal um das älteste Datum raus zu finden:

SELECT Name, Ranking, AfterParty, CompClass, DisquReason, ID FROM PARTYRELEASES LEFT JOIN PARTIES ON (PartyID = ID) WHERE ReleaseID = $id AND Date = (SELECT MIN(Date) FROM PARTYRELEASES LEFT JOIN PARTIES ON (PartyID = ID) WHERE ReleaseID = $id)

Aber das scheint mir etwas anderes zu sein. Kannst Du mir den vollen Satz zeigen?

@interpreter


melden

Programmieren: Hilfe & Austausch

14.09.2012 um 21:11
hab grad was anderes zu tun... später vielleicht :)


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

14.09.2012 um 21:11
ok


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

14.09.2012 um 23:03
wollte mich grad schlafen legen, da kam mir die idee und jetzt funktioniert es. Inner join war schon richtig, der Zusammenhang war falsch...


melden

Programmieren: Hilfe & Austausch

15.09.2012 um 00:05
dann zeig mal, wie du es jetzt gemacht hast. :)


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

15.09.2012 um 06:07
Das Geheimnis ist/war, den INNER JOIN schon an RELEASE_COMMONS an zu setzen, nicht erst an COMMONS:

INNER JOIN RELEASE_COMMONS RCT ON (R1.ID = RCT.ReleaseID AND RCT.TagID = {$_GET['tag']})

Denn was ich wirklich wollte, war nicht zwei COMMONS von unterschiedlichem Typ zu finden (owohl das dann implizit auch so ist), sondern per ihrer ID. Also ein Eintrag in RELEASES sollt einmal COMMONS ID = 4 (zB) haben und auch das COMMONS mit ID = 8.

Jetzt hab ich aber noch ein weiteres Problem endeckt, das so zwar nichts mit dem neuen Einbau zu tun hat (hab ich aus probiert), aber ähnlich wirkt. Sobald ich an gebe, dass ein COMMONS mit zB ID = 4 vorhanden sein soll, wird ein weiteres COMMONS, das dem RELEASES Eintrag auch zugeordnet ist, nimmer über den Bestandteil seines Namens auffindbar (LIKE '%$word%'). Es soll aber, auch bei Einschränkung des Suchradius auf COMMONS ID = 4, dieses weiter Eingschränkt werden, durch den Namen der COMMONS, die ebenfalls zugeordnet sind.... ich hoffe ich konnte das darstellen.

$where_array = array(); foreach ($words_array as $word) { $where_array[] = "(NAMES.Name LIKE '%$word%' OR FILES.FileLink LIKE '%$word%' OR CX.Name LIKE '%$word%' OR R1.Title LIKE '%$word%' OR R1.SubTitle LIKE '%$word%' OR DATE_FORMAT(R1.Date, '%Y') LIKE '%$word' OR R2.Title LIKE '%$word%' OR C2.Name LIKE '%$word%')"; } if ($_GET['cat']) $where_array[] = "C1.ID = ".$_GET['cat']; if ($_GET['tag']) $tag_inner = "INNER JOIN RELEASE_COMMONS RCT ON (R1.ID = RCT.ReleaseID AND RCT.TagID = {$_GET['tag']})"; $where_string = implode(" AND ",$where_array); // C1 is for the class for sorting and CX is for the tag, effect and family for finding if (!$result = $mysqli->query("SELECT SQL_CALC_FOUND_ROWS R1.ID FROM RELEASES R1 LEFT JOIN RELEASE_COMMONS RC ON R1.ID = RC.ReleaseID LEFT JOIN COMMONS C1 ON (RC.TagID = C1.ID AND C1.Typ = ".CMN_CLASS.") LEFT JOIN COMMONS CX ON RC.TagID = CX.ID $tag_inner LEFT JOIN FILES ON FILES.ReleaseID = R1.ID LEFT JOIN CREDITS ON CREDITS.ReleaseID = R1.ID LEFT JOIN AUTHORS ON AUTHORS.ID = CREDITS.AuthorID LEFT JOIN NAMES ON NAMES.AuthorID = AUTHORS.ID LEFT JOIN RELEASES R2 ON R1.SoundFormatID = R2.ID LEFT JOIN COMMONS C2 ON R1.series_id = C2.ID WHERE $where_string GROUP BY R1.ID $sort_string LIMIT $start,$show")) goto fail;

@interpreter


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

15.09.2012 um 06:48
Nun gut, nachdem ich das

if ($_GET['cat']) $where_array[] = "C1.ID = ".$_GET['cat'];

durch

if ($_GET['cat']) $cat_inner = "INNER JOIN RELEASE_COMMONS RCC ON (R1.ID = RCC.ReleaseID AND RCC.TagID = {$_GET['cat']})";

ersetzt habe (und das $cat_inner in den query string mit auf genommen, wie zuvor beim tag).

Aber oh, schon wieder ein Problem: sortieren nach C1. funktioniert nicht, sobald ich einen Suchbegriff aus einem Tag zur Einschränkung verwende. Hier der Sortierpart:

$columns = array("Title","Type","Author","Year"); if (!$sort) $sort = "Title"; switch ($sort) { case "Title": $sort_string = "ORDER BY R1.Title $sort_direction, YEAR(R1.Date) $sort_direction"; break; case "Year": $sort_string = "ORDER BY YEAR(R1.Date) $sort_direction, R1.Title $sort_direction"; break; case "Type": $sort_string = "ORDER BY C1.Name $sort_direction, R1.Title $sort_direction"; break; case "Author": $sort_string = "ORDER BY NAMES.Name $sort_direction, R1.Title $sort_direction"; break; }


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

15.09.2012 um 11:14
ok, jetzt geht alles. Ich habe jetzt jeden JOIN an der Basis angesetzt, also an RELEASES.

SELECT SQL_CALC_FOUND_ROWS R1.ID FROM RELEASES R1 LEFT JOIN RELEASE_COMMONS RC ON R1.ID = RC.ReleaseID LEFT JOIN COMMONS C1 ON (RC.TagID = C1.ID AND C1.Typ = ".CMN_CLASS.") LEFT JOIN RELEASE_COMMONS RCX ON R1.ID = RCX.ReleaseID LEFT JOIN COMMONS CX ON (RCX.TagID = CX.ID) $tag_inner $cat_inner LEFT JOIN FILES ON FILES.ReleaseID = R1.ID LEFT JOIN CREDITS ON CREDITS.ReleaseID = R1.ID LEFT JOIN AUTHORS ON AUTHORS.ID = CREDITS.AuthorID LEFT JOIN NAMES ON NAMES.AuthorID = AUTHORS.ID LEFT JOIN RELEASES R2 ON R1.SoundFormatID = R2.ID LEFT JOIN COMMONS CS ON R1.series_id = CS.ID

Merke: man muß immer den ganzen Weg zu einem JOIN bauen, immer von der Haupttabelle aus gehen. (?)


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

15.09.2012 um 15:34
@interpreter

Irgendwas geht immer nicht: nachdem nun die zwei Kategorien gleichzeitig funktionieren, obwohl ich noch nicht 100% verstanden habe wie, gibts jetzt ein Sortierproblem mit einer Tabelle die sich selbst n:m refernziert, also über eine extra n:m Tabelle Namens CC:

SELECT * FROM COMMONS C LEFT JOIN COMMON_COMMONS CC ON CC.SeriesID = C.ID LEFT JOIN COMMONS C2 ON (C2.ID = CC.TagID AND C2.Typ = ".CMN_CLASS.")

Das soll so sein, weil und damit eine Kategorie C selber auch Tags C2 haben kann, und weil Kategorien und Tags in der selben Tabelle abgelegt sind, über einen Eintragstyp.

Sortiert soll nach C2.Name werden, bringt aber Durcheinander. Hast Du, hat wer, eine Idee?

ps: wenn ich C2 inner joine statt left, dann wird richtig sortiert. Die einträge aus C die keine Zuweisung in C2 haben, bleiben dann aber draußen.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

16.09.2012 um 18:45
COMMONS ist die selbe Tabelle die Kategorien und auch Tags enthält, wobei durch einen Eintrags-Typ unterschieden wird. Eine Kategorie kann jedoch selber auch wieder getaggt sein, das geht über eine m:n Tabelle, hier namens COMMON_COMMONS.

Sortiert werden soll nach C2.Name. Es kommt aber eine unstimmige Reihenfolge raus. Doch wenn ich C2 INNER statt LEFT joine, dann stimmt die Reihenfolge. Es fliegen dann aber die Sätze raus die in C1 oder C2 nicht vor kommen.

ps: meine obige Syntax funktioniert wunderbar wenn das was hier durch C1 und C2 representiert wird, nicht die selbe Tabelle ist.

@interpreter


melden

Programmieren: Hilfe & Austausch

16.09.2012 um 18:48
@AnGSt

der Code den du angezeigt hast, ist der vollständig? da ist zumbeispiel kein C1 und C2 drin...

geht es da um die gleiche Abfrage wie vorher?


Anzeige

melden