[MySQL] ORDER BY andere table

flokli

Erfahrenes Mitglied
Hallo,

ich stecke grade irgendwie fest...

Habe 2 Tabellen:
Code:
CREATE TABLE `booking` (
  `id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
)

CREATE TABLE `entry` (
  `id` int(11) NOT NULL auto_increment,
  `booking` int(11) NOT NULL,
  `inout` enum('in','out') NOT NULL,
  `accnr` varchar(4) NOT NULL,
  `date` int(10) NOT NULL default '0',
  `value` double NOT NULL default '0',
  `reason` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `date` (`date`)
)

Ich möchte diese Daten folgendermaßen ausgeben (bisschen viel denglisch, ich weiß :) ):

- PHP lässt sich alle bookings anzeigen (SELECT * FROM `booking`)
- Pro "booking" werden dann alle "entries" angezeigt mit der aktuellen "booking"-id. (SELECT * FROM `entry` WHERE `booking`='$id')

Jetzt möchte ich, dass die erste Abfrage MySQL-seitig so sortiert wird, dass bei allen "entries" dieser "booking" das größte "date" ausgewählt wird und nach diesem dann die "bookings" sortiert werden.
(Hoffe das war verständlich :) )

Geht das? Wenn ja, wie?
 
Moin flokli,

es kommt darauf an, ob Du tatsächlich "alle" Bookings ermitteln willst oder nur die, die auch mindestens einen Datensatz in der entry-Tabelle haben.
Im zweiten Fall (der mir vom Prozess her eher einleuchtet) wäre das SELECT sinngemäß
Code:
SELECT b.* FROM booking b 
INNER JOIN (select booking, max(date) as maxdate 
from entry group by booking) e 
on  b.id = e.booking
order by maxdate desc
[ungetestet]

Grüße
Biber
 
Habe es jetzt so aufgeschrieben:
Code:
 SELECT *
FROM `tbl_booking`
INNER JOIN (

SELECT `booking` , max( `date` ) AS `maxdate`
FROM `tbl_entry`
GROUP BY `booking`
) `tbl_entry` ON `tbl_booking`.`id` = `tbl_entry`.`booking`
ORDER BY `maxdate` DESC
LIMIT 0 , 30

Das ist doch so immer noch korrekt, oder?
Sorry, bei Joins bin ich mir immer unsicher :-(
Zumindest scheint es das Gewünschte zu liefern, auch wenn ich jetzt 2 identische Spalten (booking und id) rausbekomme... :)

Lässt sich die eine (überflüssige) Spalte noch ausblenden?
 
Moin flokli,

ist alles richtig so, wobei allerdings...
a) könntest Du natürlich statt "SELECT *" jetzt die Auswahl auch mit "Select id, FeldX, FeldY ..." auf die Felder einschränken, die Du brauchst. Wobei sich das ja wiederum nach Deinem ersten Post auf dass Feld "id" beschränkt.
b) ein "Select *" habe ich genommen, weil ich irgendwie unterstellt habe, dass die Tabelle
`booking` nicht nur, wie gepostet ein einziges Feld " `id` int(11) NOT NULL " hat, sondern eine ID (hoffentlich) auch noch Attribute wie "Bezeichnung" "Angelegt am" "kategorie"..etc.
c) sollte das gar nicht so sein, also Table "booking" wirklich außer dem PK/FK "Id" gar keine Felder haben, dann würde sich das Ergebnis ja auch mit diesem etwas schlankeren Codeschnipsel erzielen lassen.
Code:
SELECT `booking` , max( `date` ) AS `maxdate`
FROM `tbl_entry`
GROUP BY `booking`

Grüße
Biber
 
Momentan hat tbl_booking nur eine Spalte, da kommen aber später noch welche hinzu...

Das SELECT werde ich anpassen.

Danke!
 

Neue Beiträge

Zurück