MySQL - Abfrage, 2 Tabellen, Bedingungen

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

MySQL - Abfrage, 2 Tabellen, Bedingungen

Beitrag 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 ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
HoDam
Beiträge: 82
Registriert: 19.11.2004 13:57
Wohnort: Köln, Cologne

Beitrag 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
PB 4 Final
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ne sry bobobo

das DESC hat keinen aeinfluss auf das GROUP BY
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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]]
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Re: MySQL - Abfrage, 2 Tabellen, Bedingungen

Beitrag 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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Antworten