fehlerbehafteter Join

Online-Skater

Erfahrenes Mitglied
Hi also ich habe ein MYSQL Problem und kenne mich da nicht so gut aus:

Folgende Tabellenstruktur

mk_forum
`fid` INT(10) NOT NULL auto_increment,
`bereich` VARCHAR(25) NOT NULL,
PRIMARY KEY (fid)

mk_forum_topic
`tid` INT(10) NOT NULL auto_increment,
`fid` INT(10) NOT NULL,
`topics` VARCHAR(100) NOT NULL,
`hits` INT(10) NOT NULL,
`autor` VARCHAR(20) NOT NULL,
`close` CHAR(1) NOT NULL,
PRIMARY KEY (tid)

mk_forum_post
`pid` INT(14) NOT NULL auto_increment,
`tid` INT(10) NOT NULL,
`fid` INT(10) NOT NULL,
`post` TEXT NOT NULL,
`poster` VARCHAR(20) NOT NULL,
`datum` DATETIME NOT NULL,
PRIMARY KEY (pid)

Code:
SELECT mk_forum_topic.tid,topics,hits,autor,close,poster,
                  UNIX_TIMESTAMP(datum) AS dato FROM mk_forum_topic, mk_forum_post
                  WHERE mk_forum_topic.fid=$fid AND mk_forum_post.fid=$fid
                  AND mk_forum_topic.tid = mk_forum_post.tid GROUP BY tid ORDER by pid DESC

Das ist der Bereich wo die Themen in einem Bereich angezeigt werden. $fid wird übergeben sobald man auf einen Bereich klickt z.B. 2
Der Zweck sollte sein das mir die Themen nach Datum sortiert werden, also neustes nach oben. Ich habe festgestellt das ein reines ordnen nach datum mit typ Datetime schon nicht geht deswegen diese Lösung die aber auch nicht richtig hinhaut.
Vllt. wisst ihr wie ich das machen kann. Danke

zusatz

es bringt ebenfalls nichts wenn ich:
order by datum
order by dato
oder sonstwas ordne ob asc oder desc :/
 
Zuletzt bearbeitet:
wo sind die Profis ? Ich verzweifle es ist ja nicht so das es überhaupt nicht geht sondern das kommt mir vor als wenn es vom Wetter abhängig ist manchmal ja manchmal nein :/
Wäre sehr dankbar wenn einer sich mal lokal die tabs installt und dann 2 inserts macht und diesen query macht damit er vllt sagen kann woran es liegt :-(
 
Hmm ich habs versucht komme noch nicht ganz klar.

Code:
SELECT a.tid, a.topics, a.hits, a.autor, a.close, b.poster, UNIX_TIMESTAMP( b.datum ) AS dato
FROM mk_forum_post b
LEFT JOIN mk_forum_topic a ON a.tid = b.tid AND a.pid < b.pid
WHERE a.fid =5 AND b.fid =5 AND b.pid IS NULL
ORDER BY b.pid DESC
LIMIT 0 , 30

Das klappt nicht, ich weis nicht welch Spalte ich nehmen soll für den a.id < b.id eigentlich pid aber die gibt es in einer tabelle nicht deswegen kommt:

#1054 - Unknown column 'a.pid' in 'on clause'

Kann mir bitte wer helfen mit LEFT JOIN hab ich nu bissl gerafft aber die Vergleichsbedingung kann ich noch nicht ... :(
 
So könnte Dein Query aussehen, ist aber ungetestet:
Code:
SELECT 
  mk_forum_topic.tid,
  mk_forum_topic.topics,
  mk_forum_topic.hits,
  mk_forum_topic.autor,
  mk_forum_topic.close,
  a.poster,  
  UNIX_TIMESTAMP(a.datum) AS dato 
FROM mk_forum_topic
LEFT JOIN mk_forum_post a
  ON mk_forum_topic.tid=a.tid
    AND mk_forum_topic.fid=$fid 
LEFT JOIN mk_forum_post b
  ON a.tid=b.tid
    AND a.datum<b.datum
WHERE b.pid IS NULL
ORDER by a.datum DESC
Möglicherweise musst Du noch den ein oder anderen Syntaxfehler eliminieren.

Gruß hpvw

PS: Wieso speicherst Du in der Posting-Tabelle die fid? Ein Posting kann doch nicht zu mehreren Topics gehören, oder? Du kommst über das zugehörige Topic immer an die fid ran.

PPS: Warum wandelst Du das Datum in einen Unix-Timestamp um? Formatieren könntest Du es auch mit der MySQL-Funktion DATE_FORMAT.
 
Also dein Query funktioniert so wie er da ist schon ganz gut.
Aber ich erhalte folgendes Ergebnis:

tid topics hits autor close poster dato
13 test123 6 shadow 0 test 1136502221
14 test1234 2 shadow 0 NULL NULL

Das untere ist aber unerwünscht da es auch zu einem anderen Bereich gehört.

Da ich noch nicht so gut bin, kenne ich die Optimierung nicht, die fid ist in der posttabelle damit die posts eine zuordnung haben in welchem bereich sie gehören.
Aber der letzte Eintrag hat eine andere fid :(

Ich probier weiter und gebe weitere fakten wenn ich sie finde
Aber erstmal vielen Dank
 
Online-Skater hat gesagt.:
Das untere ist aber unerwünscht da es auch zu einem anderen Bereich gehört.
Sorry, da hast Du recht. Der erste join muss ein einfacher join und kein left join sein.

Online-Skater hat gesagt.:
Da ich noch nicht so gut bin, kenne ich die Optimierung nicht, die fid ist in der posttabelle damit die posts eine zuordnung haben in welchem bereich sie gehören.
Aber das steht doch schon in der eindeutig zugeordneten Topic-Tabelle?

Gruß hpvw
 
Vielen Vielen Dank hpvw :)

Das is echt genial, ich werd emich mal damit auseinandersetzen und das lernen, es ist ja soviel möglich ;) Das interessiert mich mal und nochma meinen besten Dank die Abfrage is echt heavy ^^

PS. Das mit dem Datum mache ich so damit ich mit php date() formatiere
Code:
$datum = date("d.m.y | H:i", $row->dato);

und mit der fid ok das überlege ich mir du hast natürlich recht dann muss ich meine abfragen alle überarbeiten und auf *kompliziert*
umstellen :)

*heavy mysql studier* ;-]
 
Online-Skater hat gesagt.:
PS. Das mit dem Datum mache ich so damit ich mit php date() formatiere
Code:
$datum = date("d.m.y | H:i", $row->dato);
Das kannst Du Dir in PHP sparen:
Code:
SELECT
  #...
  DATE_FORMAT(a.datum,'%d.%m.%y | %H:%i') AS formattedDate
FROM
  #...
Gruß hpvw
 
Zurück