Seite 1 von 1

MySQL - Abfrage, 2 Tabellen, Bedingungen

Verfasst: 23.05.2009 15:54
von STARGÅTE
Tachchen,

ich teste nun schon seit mehreren Stunden an einem wahrscheinlich einfachem Problem.

Folgende Situation: Es existieren 2 Tabellen:

Code: Alles auswählen

Tabelle 'Thema'
======================
ID  Name
----------------------
1   BeispielA
2   BeispielB
3   BeispielC
======================

Tabelle 'Beitrag'
======================
ID  ThemaID  Autor
----------------------
1   1        Dieter
2   3        Thomas
3   2        Peter
4   2        Dieter
5   3        Dieter
6   2        Peter
7   1        Thomas
8   3        Peter
9   3        Thomas
======================
Nun möchte ich folgendes Ergebnis haben:
Liste aller Themen + Autor des neusten Beitrag in diesem Thema + Geordnet nach dem neusten

neu und Zeit bezieht sich hierbei auf die Beitrag.ID, je höher desto neuer.

Es sollte dann also folgde Tabelle ausgegeben werden:

Code: Alles auswählen

Name        Autor
----------------------
BeispielC   Thomas
BeispielA   Thomas
BeispielB   Peter
======================
So meine erste Idee war erst mal:

Code: Alles auswählen

SELECT Name, Autor FROM Thema
 INNER JOIN Beitrag ON Beitrag.ThemaID = Thema.ID
GROUP BY Thema.ID ORDER BY Beitrag.ID DESC
Das liefert mir schon mal das "richtige Format":

Code: Alles auswählen

Name        Autor  
----------------------
BeispielB   Peter 
BeispielC   Thomas 
BeispielA   Dieter 
Allerdings Grupiert mir GROUP BY so, das immer der erste Beitrag genommen wird, wie erhalte ich nun aber den letzen des jeweiligen Themas ?

Verfasst: 02.07.2009 21:53
von HoDam
SELECT Name, Autor FROM Thema
INNER JOIN Beitrag ON Beitrag.ThemaID = Thema.ID
GROUP BY Thema.ID ORDER BY Beitrag.ID ASC

So auf die Schnelle ASC statt DESC nutzen. Allerdings jetzt nicht geprüft

Verfasst: 03.07.2009 11:59
von bobobo
ein weiteres DESC hilft

SELECT Name, Autor FROM Thema
INNER JOIN Beitrag ON Beitrag.ThemaID = Thema.ID
GROUP BY Thema.ID DESC ORDER BY Beitrag.ID DESC


das ASC hilft hier eher nicht.

Verfasst: 03.07.2009 13:03
von STARGÅTE
ne sry bobobo

das DESC hat keinen aeinfluss auf das GROUP BY

Verfasst: 03.07.2009 16:01
von bobobo
bei mir schon (MySQL Version 5.0.18 auf nem Linux)

SELECT Name, Autor FROM Thema
INNER JOIN Beitrag ON Beitrag.ThemaID = Thema.ID
GROUP BY Thema.ID DESC ORDER BY Beitrag.ID DESC


liefert haargenau

'BeispielB', 'Peter'
'BeispielC', 'Thomas'
'BeispielA', 'Dieter'

aus Testdaten die exakt Deinen entsprechen
Auszug aus der Lektüre zur Select-Syntax
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr, ...
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]

Verfasst: 03.07.2009 17:37
von DarkDragon
Wenn bobobo's dings nicht geht:

Code: Alles auswählen

SELECT Name, Autor
  FROM Thema
  INNER JOIN Beitrag ON Beitrag.ThemaID = Thema.ID
  WHERE Beitrag.ID >=
  ALL (
   SELECT b2.ID
   FROM Beitrag AS b2
   WHERE b2.ThemaID = Thema.ID
);
Damit hast du deine 3 Tupel. Aber ist vllt. n bissel overkilled.

Verfasst: 04.07.2009 00:53
von STARGÅTE
dzu hast was missverstanden bobobo:

Was was du raus bekommst bekomme ich ja auch raus, nur ist es nicht das was ich will!
ich würde gerne :
Name Autor
----------------------
BeispielC Thomas
BeispielA Thomas
BeispielB Peter

Also aus den Themen immer den letzten autor ...

@DarkDragon

jo das geht, nur verschachtelte Select sind bei großen tabellen später sehr langsam ... mal sehen ich bastel noch n bisschen rum

Re: MySQL - Abfrage, 2 Tabellen, Bedingungen

Verfasst: 25.11.2009 21:37
von Karl
Hallo,

ich vermute, dass die Abfrage so nicht funktionieren kann (Grouping per Beitrag.ID killt unter Umständen die Restmenge?).

Man kommt wohl nicht um eine Unterfrage drumrum:

Code: Alles auswählen

SELECT Name, Autor FROM Thema
INNER JOIN Beitrag ON Beitrag.ThemaID = Thema.ID
WHERE Thema.ID = (SELECT MAX(b.ID) FROM Beitrag b WHERE b.ThemaID = Beitrag.ThemaID)
ORDER BY Beitrag.ID


Wenn Unterabfragen nerven, kann man auch eine temporäre Tabelle für die Beiträge bzw. einen View benutzen. Wie das in MySQL aussieht ->? Auf MS SQL-Server z. B. so:

Code: Alles auswählen

SELECT ID, ThemaID, Autor
INTO #temp
FROM Beitrag
WHERE ThemaID = ... (wie oben)
go
SELECT Name, Autor
FROM Thema, #temp
WHERE #temp.ThemaID = Thema.ID
ORDER BY #temp.ThemaID 
Der Vorteil liegt in der Zwischentabelle - man kann diese auch zu einem anderen Zeitpunkt anlegen. Im Grunde sind das zeitlich verlagerte Unterabfragen.

Möglicherweise gibt es aber eine noch bessere Lösung.

Gruß

Der Karl