Subquery auflösen !?

JoelH

Erfahrenes Mitglied
Ich hab folgendes







Code:
SELECT tid, erstellerid FROM topics WHERE tid = 
(SELECT  DISTINCT tid
FROM topicbeitraege
WHERE fid = 4
ORDER  BY eid DESC )



Dieser Query macht was ich will , ist allerdings leider nicht Mysql 4.0.14
kompatibel Kann ich den auflösen ?
 
Hi

hastes mal mit einem Join versucht mit Using(tid) oder on tab1.tid=tab2.tid, den Distinct auf den kompletten Select gelegt und dann erst die Where-Bedingung gesetzt?

BTW ich kann aus diesen Statements ziemlich schlecht herauslesen, was letzl. verlangt wird.
 
Grübel :)

select t.tid,t.erstellerid,max(b.eid) from topics as t left join topicbeitraege as b
on t.tid = b.tid where b.fid = 4 group by b.eid

- Ungetestet :)
 
hmm,

@melmager
Das wäre zu einfach gewesen ;)

@Luzie
Okay, noch ein paar Details.
Ich habe eine Tabelle topicbeitraege, die hat Einträge (logisch). Der Schlüssel ist die eid (EintragsID) dazu hat sie einen Fremschlüssel, wenn du so willst tid (topicID). eine tid kann also viele eid haben. Ich brauche jetzt eine Liste die Daten aus der Tabelle topics ausliest (tid, erstellerid ) diese sollen allerdings in einer gewissen Reihenfolge ausgelesen werden. Nämlich genau in dieser =>
Code:
SELECT DISTINCT tid FROM topicbeitraege ORDER BY eid DESC
Ich brauche also jede tid nur einmal. Und genau hier scheitet es. Er vergisst beim join nämich das DISTINCT :( UNd wenn ich eid aus dem auslesenden SELECT weg lasse vergisst er die Sortierung :(
Code:
SELECT  b.tid, b.eid, tb.fid, tb.tid, tb.topicname, tb.erstellerid, tb.helped, tb.state, us.pseudonym, tb.hits
FROM topicbeitraege b
LEFT  JOIN topics tb ON tb.fid = b.fid AND tb.tid = b.tid
LEFT  JOIN user us ON tb.erstellerid = us.erstellerid
WHERE b.fid = 4
ORDER  BY b.eid DESC
Das ist einer der ganz gut ist aber leider auch zuviel ausgibt.

Ich bekomme jetzt
sowas

tid | eid | ........
120 | 800 | ...
120 | 798 | ....
120 | 796 | ...
112 | 795 | ....
118 | 791 | ....

ich hätte aber gerne nur

tid | eid | ........
120 | 800 | ...
112 | 795 | ....
118 | 791 | ....

also lasse ich das b.eid im SELECT weg bekomme dann aber leider nur

tid | ........
120 | ...
118 | ....
112 | ....


das ist falsch sortiert :( Er sortiert dann nimmer nach der eid sondern wieder nach der tid :( Warum ?

Auch nicht schlecht ist der aber leider auch falsch
Code:
SELECT tb.fid, tb.tid, tb.topicname, tb.erstellerid, tb.helped, tb.state, us.pseudonym, tb.hits, COUNT(b.tid) counted
  FROM topics tb
  LEFT JOIN user us
    ON tb.erstellerid = us.erstellerid
  LEFT JOIN topicbeitraege b
    ON tb.fid = b.fid
   AND tb.tid = b.tid
 WHERE tb.fid=4
 GROUP BY tb.fid, tb.tid, tb.topicname, tb.erstellerid, tb.helped, tb.state, us.pseudonym, tb.hits
ORDER BY b.eid DESC
Wieder sortiert nach der b.eid DESC leider auch hier das selbe Problem, er ignoriert einfach das ORDER BY :(
 
Hmm ganz gebe ich noch nicht auf mit meiner lösung:

select t.tid,t.erstellerid from topics as t left join topicbeitraege as b
on t.tid = b.tid where b.fid = 4 group by b.tid
order by b.eid desc

---

DISTINCT tid == group by b.tid

--

LEFT JOIN user us ON tb.erstellerid = us.erstellerid
wo kommt denn das plötzlich her ?
ist aber im erstposting nix von gesagt worden -

wenn der schon mal gut ist:

SELECT b.tid, b.eid, tb.fid, tb.tid, tb.topicname, tb.erstellerid, tb.helped, tb.state, us.pseudonym, tb.hits
FROM topicbeitraege b
LEFT JOIN topics tb ON tb.fid = b.fid AND tb.tid = b.tid
LEFT JOIN user us ON tb.erstellerid = us.erstellerid
WHERE b.fid = 4 group by b.tid
ORDER BY b.eid DESC

dann einfach noch ein group by rein mit tid :)
 
Er kann nicht nach 'eid' sortieren. Geht einfach nicht ;) Weil der 'tid' ja mehrere 'eids' zugeordnet sind.

so ein Statement geht nicht so einfach bei mysql (leider), ich hatte das Problem nämlich auch schonmal in diese Forum ;)
 
Zurück