# sortieren nach Datum mit SQL von 2 Tabellen



## lukelukeluke (2. Februar 2006)

Hallo zusammen,
Ich habe folgende 2 Tabellen:
tabelle1:
*id_item*
1
2
3

tabelle2:
*item_id / datum*
1   2006
2   2004
2   2001
3   2007
1   2001
3   2002
2   2000

Wiedergeben möchte ich eigentlich nur die Tabelle 1. Ich will Tabelle 1 so wiedergeben, dass die Zeile, welche den neusten Eintrag enthält, zu oberst is. Diese Einträge sind in Tabelle 2.
Der Eintrag 3 müsste also als erstes kommen weil er das neuste datum hat. danach käme 1 mit dem zweit neusten und dann noch 2 mit dem drittneusten. Weiss jemand wie das möglich ist?
Vielen Dank!

(habe schon verschiedenes probiert:
_SELECT * FROM tabelle1,tabelle2 WHERE tabelle2.item_id=tabelle1.id_item ORDER BY tabelle2.datum DESC_
kam aber nichts dabei raus, wie ich es auch abgeändert habe... Ich will auch nicht alle Einträge der tabelle2 ausgeben, sondern eben nur die von Tabelle 1 aber so sortiert, das die mit den neusten Unteritems zu oberst sind. Mit Select Distinct bin ich auch nicht weitergekommen...)


----------



## ronaldo84 (2. Februar 2006)

Die Lösung ist dabei ein Join
Beispiel:

```
Select * from tabelle2 left join tabelle1 on tabelle2.name = tabelle1.id order by tabelle1.datum desc;
```
Du mußt es jetzt nur dementsprechend abändern.
€ bei deinem Beispiel:

```
Select * from tabelle1 left join tabelle2 on tabelle1.id=tabelle2.id order by tabelle2.datum;
```


----------



## lukelukeluke (3. Februar 2006)

ronaldo84 hat gesagt.:
			
		

> Die Lösung ist dabei ein Join


Hi Ronaldo,
Vielen Dank für deine Antwort!
Ich habe dein Beispiel 100 mal durchprobiert und auch abgeändert, hat einfach nie funktioniert, so wie ich es wollte.... Um das Problem nochmals zu schildern habe ich ein Bild gemacht angehängt, damit man sicher weiss was ich meine.
Ich will in der Ausgabe alle Einträge von table1 ausgeben, absteigend sortiert, nach welchen in table2 die neusten Einträge haben.

Überigens, hier habe ich auch Infos gesammelt (u.a. GROUP BY und die verschiedenen JOINS ahbe ich gestestet, leider ohne Erfolg): http://www.w3schools.com/sql/sql_join.asp


----------



## ronaldo84 (3. Februar 2006)

Hm.
Nach deine Grafik müsste es eigentlich so klappen:

```
SELECT table1.item_id, table1.item_name 
FROM table1 LEFT JOIN table2 ON table1.item_id = table2.item_id
ORDER BY table2.item_date
```
Kommt denn dabei eine Fehlermeldung wenn du das so ausführst? Mit welchem Datenbanksystem machst du das? Welche Version?


----------



## lukelukeluke (3. Februar 2006)

Hallo nochmalRonaldo,
Ich verwende MySQL Version 4.0.15 mit MyISAM...
Ich habe mal die Tabellen genau so erstellt wie auf dem Bild und die gleichen Daten eingefügt. Dann habe ich dein Query eingegeben (mit einer kleinen Änderung, der Fremdschlüssel in table2 heisst item_id und nicht id_item). Was rausgekommen ist ist auf dem Bild, welches ich nun anhänge.
Hier noch der SQL-Befehl für die Tabellen wenn du es selbst ausprobieren magst:


```
CREATE TABLE `table1` (
  `item_id` int(11) NOT NULL auto_increment,
  `item_name` varchar(20) NOT NULL default '',
  PRIMARY KEY  (`item_id`)
) TYPE=MyISAM AUTO_INCREMENT=6 ;
INSERT INTO `table1` VALUES (1, 'item one');
INSERT INTO `table1` VALUES (2, 'item two');
INSERT INTO `table1` VALUES (3, 'item three');
INSERT INTO `table1` VALUES (4, 'item four');
INSERT INTO `table1` VALUES (5, 'item five');

CREATE TABLE `table2` (
  `id_item` int(11) NOT NULL default '0',
  `item_date` int(11) NOT NULL default '0'
) TYPE=MyISAM;
INSERT INTO `table2` VALUES (1, 2006);
INSERT INTO `table2` VALUES (4, 2005);
INSERT INTO `table2` VALUES (2, 2007);
INSERT INTO `table2` VALUES (1, 2001);
INSERT INTO `table2` VALUES (2, 2004);
INSERT INTO `table2` VALUES (3, 2000);
INSERT INTO `table2` VALUES (5, 2000);
INSERT INTO `table2` VALUES (1, 2002);
INSERT INTO `table2` VALUES (3, 2001);
INSERT INTO `table2` VALUES (4, 2003);
```

Vielen Dank für deine Hilfe!
-Luke


----------



## ronaldo84 (3. Februar 2006)

Das ist soweit schon richtig. Du musst jetzt nur noch die sortierreihenfolge mit DESC bestimmen
Siehe Anhang. Jetzt müsstes du es eventuelle nur noch nach table1.item_id gruppieren.


----------



## lukelukeluke (6. Februar 2006)

Leider ist dieses gruppieren ja genau das, was ich suche.
Wenn ich folgendes SQL Statement verwende:
*SELECT * FROM table1 LEFT JOIN table2 ON table1.item_id=table2.id_item GROUP BY table1.item_id ORDER BY table2.item_date DESC*
dann werden die Einträge zwar gruppiert, jedoch nicht mehr sortiert. Es sieht zwar fast so aus als würde es funktionieren (Angehängtes Bild). Jedoch hat es in table2 einen Eintrag mit *id_item 3* und *item_date 2001*. Es müsste also dieser angezeigt werden, weil das der neuste ist.
Also immernoch kein Erfolg...


----------



## ronaldo84 (6. Februar 2006)

Man, man ist das eine schwere Geburt  . Aber ich glaube jetzt habe ich es:

```
SELECT table1.item_name, table1.item_id, max(table2.item_date) FROM table1 LEFT JOIN table2 ON table1.item_id=table2.id_item GROUP BY table1.item_id ORDER BY table2.item_date DESC
```


----------



## lukelukeluke (6. Februar 2006)

Schön wärs 
Spass beiseite, ich weiss gar nicht ob das funktioniert, was ich machen will.
Ich habe in Tabelle 2 auch noch Attribute, welche auflistbar sein sollten. table1 und table2 sind also nur abgespeckte Versionen von meinen richtigen Tabellen, da ich nicht alle Attribute anzeigen lassen wollte.
Wenn also in table2 noch ein Attribut "g_id" ist, soll der Wert in der Ausgabe angezeigt werden, welcher da beim Eintrag ist, welcher am neusten ist.
Vielleicht verstehst du jetzt auch nicht mehr was ich meine .
Ich danke dir auf jeden Fall für deine Bemühungen, wenn du weiter probieren willst kannst du das gerne, ich hatte eigentlich auf mehr Leute hier gehofft. Wenn ich die Lösung ausfindig machen kann, werde ich sie auf jeden Fall hier posten.
Danke nochmals!
Gruss,
Luke


----------

