Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

MySQL Left Join sortieren

Frage Entwicklung Datenbanken

Mitglied: 5322

5322 (Level 1)

28.09.2005, aktualisiert 15:54 Uhr, 10505 Aufrufe, 13 Kommentare

Hallo zusammen,
Habe ein Problem mit einem MySQL - Befehl:

SELECT
member.id,
member.membername,
urlaub.urlaubanfang,
urlaub.urlaubende,
urlaub.urlaubinfo
FROM member
LEFT JOIN urlaub
ON urlaub.memberid = member.id
GROUP BY member.id

Der funktioniert soweit, einzigstes Problem ist das ich immer den ersten Urlaub des Members aus der Tabelle urlaub bekomme. Möchte aber den haben, der als nächstes kommt! Kann ja sein das da die Reihenfolge nicht richtig ist. Möchte also praktisch den LEFT JOIN sortieren!
Kann mir da eben einer helfen!?
Mit ORDER BY member.id, urlaub.urlaubanfang klappts nicht, da krieg ich die Endtabelle nach memberid und urlaubsanfang sortiert...

Vielen Dank im Vorraus!
Mitglied: 16640
28.09.2005 um 12:25 Uhr
tja, da fehlt Dir wohl eine WHERE-Bedingung

<font class=code>SELECT blafasel FROM ... die JOINS WHERE urlaub.urlaubanfang größer als GETDATE() GROUP ...</font>

größer als soll eigentlich eine schließende spitze Klammer sein, aber das unterdrückt die Boardsoftware.

Ich weiss nicht, ob MySQL die GETDATE()-Funktion kennt. Ansonsten musst Du da die analoge Funktion für den aktuellen Timestamp einsetzen.

dba
Bitte warten ..
Mitglied: 5322
28.09.2005 um 12:30 Uhr
hallo,
da bekomme ich aber nicht zwangsläufig den nächsten urlaub zurück, sondern nur einen, der größer als "jetzt" ist... das kann auch der übernächste urlaub sein.
ciao!
Bitte warten ..
Mitglied: 16640
28.09.2005 um 12:50 Uhr
Was genau willst Du denn in dem Resultset haben und wie soll es ggf. sortiert sein?

dba
Bitte warten ..
Mitglied: 5322
28.09.2005 um 13:40 Uhr
ich muss nach einem feld in der tabelle urlaub sortieren können; ich sag jetzt mal bevor diese mit der tabelle member verknüpft wird. da ich ein group by mit dabei habe um nur einen datensatz pro member anzuzeigen kann ich nicht kontrollieren mit welchem urlaubs-datensatz die verknüüfung gemacht wird.
es gibt also zu jedem member mehrere einträge in der tabelle urlaub. wenn ich die beiden verknüpfe muss ich außer dem "urlaub.memberid = member.id" noch eine regelung einfügen, wie die ursprüngliche urlaubs-tabelle sortiert wird.
hoffe ihr versteht was ich meine
danke für die hilfe!
Bitte warten ..
Mitglied: 16640
28.09.2005 um 14:09 Uhr
Du unterliegst da einem Denkfehler, glaube ich.

Ein Resultset wird immer erst nach dem Joinen in die entsprechende Sortierung gebracht. Du musst also zunächst mal die Joins definieren, dann definieren, was Du an Daten im Resultset haben willst (WHERE) und schließlich sortieren (ORDER BY). Das ganze kannst Du dann noch einschränken mit Schlüsselworten wie DISTINCT oder TOP.

Wir bauen ein Beispiel:

<font class=code>
create table member
(
memberid int,
name varchar(50)
)

create table urlaub
(
memberid int,
beginn datetime,
ende datetime
)
</font>

Wenn wir jetzt einfach die beiden Tabellen joinen

<font class=code>select * from member m inner join urlaub u on m.memberid = u.memberid</font>

erhalten wir ein Resultset, in dem zu jedem Member die einzelnen Records in der Tabelle urlaub aufgeführt sind. Das können wir jetzt sortieren, bspw.:

<font class=code>select *
from member m
inner join urlaub u
on m.memberid = u.memberid
order by m.memberid, u.beginn</font>

Deine Aussage zur Verwednung des group by und daraus resultierenden einzelnen Ergebnissatzes ist nicht richtig. Bei Dir kommen da sicher noch andere Umstände ins Spiel, die das Ergebnis fälschlicherweise als fast richtig aussehen lassen.

Ich komm' nochmal auf meine Frage zurück: Was soll Dir das Resultset als Ergebnis liefern?

dba
Bitte warten ..
Mitglied: 5322
28.09.2005 um 14:36 Uhr
ok, nimm mal bitte das folgende sql und importiere es in eine db:
(urlaubid hattest du nicht, benötige ich aber...)

01.
CREATE TABLE `member` ( 
02.
  `memberid` int(11) default NULL, 
03.
  `name` varchar(50) default NULL 
04.
) TYPE=MyISAM; 
05.
 
06.
INSERT INTO `member` (`memberid`, `name`) VALUES (1, 'richard'); 
07.
INSERT INTO `member` (`memberid`, `name`) VALUES (2, 'erich'); 
08.
INSERT INTO `member` (`memberid`, `name`) VALUES (3, 'peter'); 
09.
 
10.
CREATE TABLE `urlaub` ( 
11.
  `urlaubid` int(11) default NULL, 
12.
  `memberid` int(11) default NULL, 
13.
  `beginn` datetime default NULL, 
14.
  `ende` datetime default NULL 
15.
) TYPE=MyISAM; 
16.
 
17.
INSERT INTO `urlaub` (`urlaubid`, `memberid`, `beginn`, `ende`) VALUES (1, 1, '2005-01-01 00:12:00', '2005-02-01 00:12:00'); 
18.
INSERT INTO `urlaub` (`urlaubid`, `memberid`, `beginn`, `ende`) VALUES (2, 2, '2005-03-01 00:12:00', '2005-03-02 00:12:00'); 
19.
INSERT INTO `urlaub` (`urlaubid`, `memberid`, `beginn`, `ende`) VALUES (3, 3, '2005-10-01 00:12:00', '2005-11-11 00:12:00'); 
20.
INSERT INTO `urlaub` (`urlaubid`, `memberid`, `beginn`, `ende`) VALUES (5, 3, '2007-10-01 00:12:00', '2007-11-11 00:12:00'); 
21.
INSERT INTO `urlaub` (`urlaubid`, `memberid`, `beginn`, `ende`) VALUES (4, 3, '2006-10-01 00:12:00', '2006-11-11 00:12:00');
folgendes gibt mir alle datensätze verknüpft aus:
01.
select * from member m inner join urlaub u on m.memberid = u.memberid
mit folgendem statement bekomme ich in etwa die zeilen, wie ich sie später benötige:
01.
SELECT  * FROM member m INNER  JOIN urlaub u ON m.memberid = u.memberid GROUP  BY m.memberid
und nun brauch ich hier bspw. bei "peter" den am weitesten entfernten urlaub, also im jahr 2007. wie komme ich da ran?? bei mir werden immer nur bei allen drei members die urlaube 2005 angezeigt. da ist nicht drin mit order by oder so, das sortiert mir nämlich nur die bereits fertige tabelle....

besten dank für deine unterstützung!!
Bitte warten ..
Mitglied: 16640
28.09.2005 um 14:58 Uhr
<font class=code>select
m.memberid,
m.name,
max(u.beginn) as anfang
from
member m
inner join urlaub u
on m.memberid = u.memberid

group by
m.memberid,
m.name

</font>

Meinst Du so?
Bitte warten ..
Mitglied: 5322
28.09.2005 um 15:03 Uhr
hey,
spitze!
aber jetzt kommts (so langsam wirds speziell ):
füge mal bei deinem select noch "u.ende" hinzu. und jetzt müsste auch das passende urlaubs-end-datum herauskommen, mach es aber nicht... u.ende müsste sich irgendwie auf u.anfang beziehen.
wie kann ich das machen?
Bitte warten ..
Mitglied: 16640
28.09.2005 um 15:19 Uhr
Probier das

<font class=code>select
hlp.mid,
hlp.nam,
u.beginn,
u.ende
from
(
select
mem.memberid mid,
mem.name nam,
max(url.beginn) as anf
from
member mem
inner join urlaub url
on mem.memberid = url.memberid
group by
mem.memberid,
mem.name
) as hlp
inner join urlaub u
on u.beginn = hlp.anf

</font>
Bitte warten ..
Mitglied: 5322
28.09.2005 um 15:24 Uhr
01.
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT mem.memberid mid, mem.name nam, max( url.beginn )  AS an 

evtl. weil ich nur MySQL 4.0.20 hab?
Bitte warten ..
Mitglied: 16640
28.09.2005 um 15:30 Uhr
DAS kann ich Dir nicht beantworten. Vielleicht kommen da auch Unterschiede zwischen MySQL und dem SQL Server, den ich hier verwende, zum Vorschein. Ich hab' nochmal den Code aus meinem Posting importiert und laufen lassen, um Übertragunssfehler auszuschliessen. Als Ergebnis bekomme ich das hier:

mid nam beginn ende
1 richard 2005-01-01 00:12:00.000 2005-01-02 00:12:00.000
2 erich 2005-01-03 00:12:00.000 2005-02-03 00:12:00.000
3 peter 2007-01-10 00:12:00.000 2007-11-11 00:12:00.000

Sieht doch eigentlich gut aus. Was die Fehlermeldung jetzt bei Dir verursacht, müsstest Du mal herausfinden und dann einen Workaround für bauen.

Vielleicht stoert er sich an 'url' oder 'mem' als Alias? Ändere doch mal in u2 und m2, die beiden. Mehr fällt mir dazu jetzt nicht ein.

sorry, dba
Bitte warten ..
Mitglied: 5322
28.09.2005 um 15:51 Uhr
hi,
also am alias liegt es nicht. subselects werden bei mysql erst ab version 4.1 unterstützt und selbstverständlich kann ich nicht so einfach updaten
gibt es hierfür evtl. noch ein workaround?
Bitte warten ..
Mitglied: 16640
28.09.2005 um 15:54 Uhr
Dann mach's in zwei Schritten, den Subselect in eine Hilfstabelle [insert into...] und danach dann den eigentlichen Select mit dem Join auf die Hilfstabelle.

Das sollte doch funktionieren.

Ansonsten bin ich gleich erstmal weg ,-)

dba
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Datenbanken
MySQL - Join (4)

Frage von Thoomaas zum Thema Datenbanken ...

Batch & Shell
gelöst PowerShell Domain Join (2)

Frage von Patrick-IT zum Thema Batch & Shell ...

PHP
PHP MySQL Login (7)

Frage von Yanmai zum Thema PHP ...

Webbrowser
gelöst Daten in entfernte Mysql DB schreiben (3)

Frage von nullacht15 zum Thema Webbrowser ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...