Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

JOIN und letztes Datum einer Tabelle

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von zipfermaerzen, 3 März 2020.

  1. zipfermaerzen

    zipfermaerzen Neuer Benutzer

    Hallo Liebe Community,

    sitze jetzt schon seit mehreren Stunden an diesem Problem. Google war auch nicht so hilfreich - oder zumindest nicht so das ichs verstanden hab.
    Hab folgende Tabellen
    hcum
    ID_Member | Member | Rang | Eintrittsdatum
    hcumdata
    ID_Data | ID_Member | Date | Gamelevel | Ruhm

    Möchte jetzt eine Tabelle ausgeben die so aussehen sollte.
    Member - Rang - Ruhm usw.
    Dabei soll der Ruhm immer nur vom letzten Datum Date kommen.
    Bitte nicht wundern wegen den ganzen .wpdd->prefix . Ist für Wordpress
    Jetzt sieht die Abfrage mal folgendermaßen aus.

    $sql = $wpdb->get_results("SELECT ".$wpdb->prefix."hcum.*,".$wpdb->prefix."hcumdata.* FROM ".$wpdb->prefix."hcum LEFT JOIN ".$wpdb->prefix."hcumdata ON ".$wpdb->prefix."hcum.ID_Member=".$wpdb->prefix."hcumdata.ID_Member GROUP BY ".$wpdb->prefix."hcum.ID_Member ORDER BY ".$wpdb->prefix."hcumdata.Date desc");

    Gibt mir zwar alle Member aus aber nur mit dem ersten Wert der gefunden wird.
    Hoffe ich habs halbwegs erklärt das mans kapiert.
    Ich weiss sieht nicht grade professionell aus :)

    Vielleicht kann mir da jemand helfen.

    LG
    Marco
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Wenn Du gruppierst, müssen alle anderen Spalten entweder auch gruppiert oder aggregiert sein. Vermeide das * in der Select-Liste und zähle alle gewünschten Spalten auf. Achtung: MySQL erkennt NICHT, wenn Spalten im Select-Teil weder aggregiert noch gruppiert sind, und liefert statt einer Fehlermeldung ein falsches Resultat. Kapott halt.
     
  3. zipfermaerzen

    zipfermaerzen Neuer Benutzer

    Danke für deine Antwort, hat mir aber jetzt nicht wirklich geholfen :(
    Ich komm einfach nicht drauf. Mir Platz gleich mein Kopf.
    Mir wird hier immer der falsche Wert ausgegeben egal was ich da mache.
    Kann doch nicht so schwer sein nur die letzte Zeile eines Eintrages (wp_hcumdata) zum jeweiligen User (wp_hcum) zuzuordnen.
    Hier mal für Fiddle wenn jemand probieren mag.
    Die Tabellen
    Code:
    -- phpMyAdmin SQL Dump
    -- version 5.0.1
    -- https://www.phpmyadmin.net/
    --
    -- Host: 127.0.0.1
    -- Erstellungszeit: 03. Mrz 2020 um 19:05
    -- Server-Version: 10.4.11-MariaDB
    -- PHP-Version: 7.4.2
    
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
    SET time_zone = "+00:00";
    
    --
    -- Datenbank: `wordpress`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Tabellenstruktur für Tabelle `wp_hcum`
    --
    
    CREATE TABLE `wp_hcum` (
      `ID_Member` int(11) NOT NULL,
      `Member` varchar(25) COLLATE utf8_unicode_ci DEFAULT NULL,
      `Rang` varchar(25) COLLATE utf8_unicode_ci DEFAULT NULL,
      `Eintrittsdatum` date DEFAULT NULL,
      `Aktiv` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL,
      `Vorgemerkt` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    --
    -- Daten für Tabelle `wp_hcum`
    --
    
    INSERT INTO `wp_hcum` (`ID_Member`, `Member`, `Rang`, `Eintrittsdatum`, `Aktiv`, `Vorgemerkt`) VALUES
    (49, 'Member 1', 'Prätorianer', '2020-03-01', 'on', NULL),
    (50, 'Member 2', 'Prätorianer', '2020-03-02', 'on', NULL),
    (51, 'Member 3', 'Prätorianer', '2020-03-03', 'on', NULL),
    (52, 'Member 4', 'Prätorianer', '2020-03-04', 'on', NULL);
    
    -- --------------------------------------------------------
    
    --
    -- Tabellenstruktur für Tabelle `wp_hcumdata`
    --
    
    CREATE TABLE `wp_hcumdata` (
      `ID_Data` int(11) NOT NULL,
      `ID_Member` int(11) DEFAULT NULL,
      `Date` datetime DEFAULT current_timestamp(),
      `Gamelevel` int(11) DEFAULT NULL,
      `Geschenke` int(11) DEFAULT NULL,
      `Ruhm` int(11) DEFAULT NULL,
      `RL_Punkte` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    --
    -- Daten für Tabelle `wp_hcumdata`
    --
    
    INSERT INTO `wp_hcumdata` (`ID_Data`, `ID_Member`, `Date`, `Gamelevel`, `Geschenke`, `Ruhm`, `RL_Punkte`) VALUES
    (69, 49, '2020-03-03 18:01:47', 1, 1, 1, 1),
    (71, 50, '2020-03-03 18:02:34', 11, 11, 11, 11),
    (72, 51, '2020-03-03 18:02:43', 111, 111, 111, 111),
    (73, 52, '2020-03-03 18:02:52', 1111, 1111, 1111, 1111),
    (74, 49, '2020-03-03 18:03:00', 2, 2, 2, 2),
    (75, 50, '2020-03-03 18:03:12', 22, 22, 22, 22),
    (76, 51, '2020-03-03 18:03:22', 222, 222, 222, 222),
    (77, 52, '2020-03-03 18:03:31', 2222, 2222, 2222, 2222),
    (78, 49, '2020-03-03 18:03:39', 3, 3, 3, 3),
    (79, 50, '2020-03-03 18:03:47', 33, 33, 33, 33),
    (80, 51, '2020-03-03 18:03:56', 333, 333, 333, 333),
    (81, 52, '2020-03-03 18:04:06', 3333, 3333, 3333, 3333);
    
    -- --------------------------------------------------------
    
    --
    -- Tabellenstruktur für Tabelle `wp_hcumdata2`
    --
    
    CREATE TABLE `wp_hcumdata2` (
      `ID_Data2` int(11) NOT NULL,
      `ID_Member` int(11) DEFAULT NULL,
      `turnierteilnahmen` int(11) DEFAULT NULL,
      `turniergold` int(11) DEFAULT NULL,
      `turniersilber` int(11) DEFAULT NULL,
      `turnierbronze` int(11) DEFAULT NULL,
      `kampfstaerkekomplett` int(11) DEFAULT NULL,
      `verliesteilnahmen` int(11) DEFAULT NULL,
      `heldstaerke` int(11) DEFAULT NULL,
      `tslevel` int(11) DEFAULT NULL,
      `erfolge` int(11) DEFAULT NULL,
      `klassezimmerer` int(11) DEFAULT NULL,
      `klassekaempfer` int(11) DEFAULT NULL,
      `klasseschatzmeister` int(11) DEFAULT NULL,
      `klassekoch` int(11) DEFAULT NULL,
      `klassebergarbeiter` int(11) DEFAULT NULL,
      `klassealchemist` int(11) DEFAULT NULL,
      `klassetechniker` int(11) DEFAULT NULL,
      `aenderungsdatum` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
      `aenderunguser` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- --------------------------------------------------------
    
    --
    -- Tabellenstruktur für Tabelle `wp_hcumsettings`
    --
    
    CREATE TABLE `wp_hcumsettings` (
      `ID_Settings` int(11) NOT NULL,
      `Clanname` varchar(25) COLLATE utf8_unicode_ci DEFAULT NULL,
      `erfolgegesamt` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    --
    -- Daten für Tabelle `wp_hcumsettings`
    --
    
    INSERT INTO `wp_hcumsettings` (`ID_Settings`, `Clanname`, `erfolgegesamt`) VALUES
    (1, 'Clanname', 242);
    
    --
    -- Indizes der exportierten Tabellen
    --
    
    --
    -- Indizes für die Tabelle `wp_hcum`
    --
    ALTER TABLE `wp_hcum`
      ADD PRIMARY KEY (`ID_Member`);
    
    --
    -- Indizes für die Tabelle `wp_hcumdata`
    --
    ALTER TABLE `wp_hcumdata`
      ADD PRIMARY KEY (`ID_Data`);
    
    --
    -- Indizes für die Tabelle `wp_hcumdata2`
    --
    ALTER TABLE `wp_hcumdata2`
      ADD PRIMARY KEY (`ID_Data2`);
    
    --
    -- Indizes für die Tabelle `wp_hcumsettings`
    --
    ALTER TABLE `wp_hcumsettings`
      ADD PRIMARY KEY (`ID_Settings`);
    
    --
    -- AUTO_INCREMENT für exportierte Tabellen
    --
    
    --
    -- AUTO_INCREMENT für Tabelle `wp_hcum`
    --
    ALTER TABLE `wp_hcum`
      MODIFY `ID_Member` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=53;
    
    --
    -- AUTO_INCREMENT für Tabelle `wp_hcumdata`
    --
    ALTER TABLE `wp_hcumdata`
      MODIFY `ID_Data` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=82;
    
    --
    -- AUTO_INCREMENT für Tabelle `wp_hcumdata2`
    --
    ALTER TABLE `wp_hcumdata2`
      MODIFY `ID_Data2` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=48;
    COMMIT;
    
    
    Meine klaglos gescheiterten Versuche
    Code:
    -- based on answer https://stackoverflow.com/a/7745635/808921
    SELECT MAX(wp_hcumdata.Date),wp_hcum.Member,wp_hcumdata.Ruhm
    FROM wp_hcum
        LEFT JOIN wp_hcumdata ON wp_hcum.ID_Member=wp_hcumdata.ID_Member
    GROUP BY wp_hcumdata.ID_Member
    ORDER BY wp_hcumdata.Date desc;
    
    SELECT wp_hcum.Member,wp_hcumdata.Ruhm,wp_hcumdata.Date
    FROM wp_hcum
        LEFT JOIN wp_hcumdata ON wp_hcum.ID_Member=wp_hcumdata.ID_Member
    ORDER BY wp_hcumdata.Date desc;
      
    SELECT wp_hcum.Member,wp_hcumdata.Ruhm,wp_hcumdata.Date
    FROM wp_hcum
        LEFT JOIN wp_hcumdata ON wp_hcum.ID_Member=wp_hcumdata.ID_Member;
    
    Ich steig da nicht dahinter.
    Brauch nur einen Denkanstoss :(:(
     
    Zuletzt bearbeitet: 3 März 2020
  4. akretschmer

    akretschmer Datenbank-Guru

    ich schrieb: wenn Du gruppierst, müssen alle Spalten entweder gruppiert oder aggregiert sein.

    Dein SQL:

    Code:
    SELECT MAX(wp_hcumdata.Date),wp_hcum.Member,wp_hcumdata.Ruhm
    FROM wp_hcum
       LEFT JOIN wp_hcumdata ON wp_hcum.ID_Member=wp_hcumdata.ID_Member
    GROUP BY wp_hcumdata.ID_Member
    ORDER BY wp_hcumdata.Date desc;
    
    Du hast im Result 3 Spalten, davon ist eine eine Aggregation. Du hast nach einer Spalte, die nicht im Result ist, gruppiert. Das ist syntaktisch falsch, völlig falsch. MySQL ist hier blind und liefert irgendwas, nur leider keinen Fehler.

    Ich arbeite mit PostgreSQL und habe jetzt keinen Nerv mehr, Deinen Dump dafür umzuschreiben und eine Lösung zu bauen. Tag war zu lang ...

    Code:
    select spalte1, max(spalte2) from tabelle group by spalte1;
    
    wäre die prinzipielle Abfrage.

    PS.: das Konzept der referentiellen Integrität ist weitgehend unbekannt, oder?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden