Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] SQL Abfrage über 2 Tabellen, wenn eine davon leer ist

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] SQL Abfrage über 2 Tabellen, wenn eine davon leer ist

    Hallo Gemeinde,

    ich habe zwei Tabellen die identische im Aufbau sind.
    Ich frage ab mit:
    PHP-Code:
    SELECT FROM Tabelle1 Tabelle2 
    und das Ergebnis ist, wenn Tabelle2 leer ist immer NULL! Obwohl Tabelle1 voll ist.
    Erst wenn mindestens 1 Datensatz in Tabelle2 vorhanden ist lässt sich eine Abfrage durchführen.
    Muss man davon ausgehen, das eine Tabelle nicht leer sein darf?

    Danke, Helmut

  • #2
    Du machst einen impliziten (INNER-)JOIN. Wenn du ein anderes Ergebnis haben willst, musst du z.B. einen LEFT JOIN machen. Mehr dazu per Google. Bei SelfHTML gibt es auch einen guten Einsteigerartikel zu JOINs.

    Themenmoderation:
    [→] Verschoben von PHP Einsteiger

    Kommentar


    • #3
      Ich hab es mit Inner Join, Outer Join, Left Join, Right Join, Left Outer Join und Right Outer Join versucht.
      Das Ergebnis bleibt NULL.

      Kommentar


      • #4
        Dann hast du es nicht richtig gemacht.

        Kommentar


        • #5
          Zitat von Manko10 Beitrag anzeigen
          Dann hast du es nicht richtig gemacht.
          wirklich lieb von Dir, aber was ist nicht richtig?

          PHP-Code:
          SELECT
          users
          .UserName,
          users.UserMail,
          users_temp.UserName,
          users_temp.UserMail
          FROM
          users
          Inner Join users_temp ON users
          .UserName users_temp.UserName 
          oder

          PHP-Code:
          SELECT
          users
          .UserName,
          users.UserMail,
          users_temp.UserName,
          users_temp.UserMail
          FROM
          users
          Inner Join users_temp ON users
          .UserName users_temp.UserName AND users.UserMail users_temp.UserMail 

          Kommentar


          • #6
            Ist dir der Unterschied zwischen LEFT JOIN, RIGHT JOIN und INNER JOIN bekannt? Wenn nicht, solltest du den vorher nochmal nachlesen.
            Code:
            SELECT * FROM Tabelle1 a
            LEFT JOIN Tabelle2 b ON a.id = b.foreignId;
            Das ist das Schema. Hierbei dürfen ruhig entsprechende Einträge in Tabelle2 fehlen, in dem Falle werden dann die Daten aus Tabelle1 ausgelesen und die Spalten aus Tabelle2 mit NULL aufgefüllt. Du musst natürlich noch beachten, dass die WHERE-Bedingung nicht von Tabelle2 abhängig sein darf.

            Kommentar


            • #7
              Einschränkungen mit WHERE hab ich erstmal bewusst weggelassen.
              Ich wiederhole vielleicht nochmal die Fragestellung, bzw. das Problem:

              Wenn Tabelle1 sagen wir 100 Einträge hat und Tabelle2 1 Eintrag erhalte ich in der Abfrage 101 Datensätze. Hat Tabelle2 keinen Eintrag erhalte ich immer NULL.

              Es geht mir also nicht um doppelte oder falsche Ausgaben, sondern um NULL!

              Denn die Abfrage lautet ja auf Deutsch "Zeige alles von Tabelle1 und Tabelle2", da sollte 100 rauskommen und nicht NULL bloß weil Tabelle2 leer ist, denn wenn Tabelle2 1 Datensatz enthällt kommen ja auch 101 raus.

              Kommentar


              • #8
                Das hört sich irgendwie nach »Meine Tabelle ist zu groß, ich mache zwei draus« an. Wenn du keine vernünftige und logischen Beziehung darstellen kannst, wird das natürlich auch nichts. Alle Datensätze aus zwei Tabellen gleichzeitig auszugeben, ohne diese untereinander zu verknüpfen ist nicht der Zweck der Normalisierung.
                Poste doch mal ein wenig mehr über das, was du versuchst und zwar mit realem Code.

                Kommentar


                • #9
                  Klar, gerne...
                  Sinn der 2 Tabellen ist, Benutzer kann sich registrieren und wird temporär in Tabelle2 eingetragen. Meldet er sich tatsächlich dann an, wird der Eintrag aus Tabelle2 nach Tabelle1 VERSCHOBEN und als realer Benutzer eingetragen.
                  Sonst hätte ich möglicherweise jedemenge "Benutzerleichen" in meiner Benutzertabelle, wenn nach der Erstregistrierung nichts mehr passiert.
                  Tabelle1 -> users mit 4 Einträgen
                  PHP-Code:
                  CREATE TABLE IF NOT EXISTS `users` (
                    `
                  UserIDint(11NOT NULL AUTO_INCREMENT,
                    `
                  UserNamevarchar(30NOT NULL DEFAULT '',
                    `
                  UserPassvarchar(32NOT NULL DEFAULT '',
                    `
                  UserSessionvarchar(32) DEFAULT NULL,
                    `
                  UserMailvarchar(150) DEFAULT NULL,
                    `
                  Adminint(2) DEFAULT NULL,
                    `
                  dummyint(1) DEFAULT NULL,
                    `
                  kal_usetinyint(1) DEFAULT NULL,
                    `
                  gal_usetinyint(1) DEFAULT NULL,
                    `
                  ind_usetinyint(1) DEFAULT NULL,
                    `
                  gast_usetinyint(1) DEFAULT NULL,
                    `
                  kontakt_usetinyint(1) DEFAULT NULL,
                    `
                  publictinyint(1) DEFAULT NULL,
                    
                  PRIMARY KEY (`UserID`),
                    
                  UNIQUE KEY `UserName` (`UserName`),
                    
                  UNIQUE KEY `UserMail` (`UserMail`)
                  ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=45 ;

                  --
                  -- 
                  Daten für Tabelle `users`
                  --

                  INSERT INTO `users` (`UserID`, `UserName`, `UserPass`, `UserSession`, `UserMail`, `Admin`, `dummy`, `kal_use`, `gal_use`, `ind_use`, `gast_use`, `kontakt_use`, `public`) VALUES
                  (1'Öffentlich (für alle sichtbar)'''NULL'info@localhost.eu'00000001),
                  (
                  2'Helmut''026b7aa1b4aca10b91aa895bda702301'NULL'info@localhost.de'10111110),
                  (
                  43'Carmen''337db052b7b97695533184d581b79917''''post@localhost.de'00100000),
                  (
                  44'dummy''5a105e8b9d40e1329780d62ea2265d8a''''test@localhost.de'00000000); 
                  Tabelle2 -> users_temp mit 0 Einträgen
                  PHP-Code:
                  CREATE TABLE IF NOT EXISTS `users_temp` (
                    `
                  UserIDint(11NOT NULL AUTO_INCREMENT,
                    `
                  UserNamevarchar(30NOT NULL DEFAULT '',
                    `
                  UserPassvarchar(32NOT NULL DEFAULT '',
                    `
                  UserMailvarchar(150) DEFAULT NULL,
                    
                  PRIMARY KEY (`UserID`),
                    
                  UNIQUE KEY `UserName` (`UserName`),
                    
                  UNIQUE KEY `UserMail` (`UserMail`)
                  ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=49 
                  Die Abfrage

                  PHP-Code:
                  SELECT FROM users users_temp 
                  gibt NULL Datensätze aus.

                  Enthält users_temp 1 Datensatz, werden 4 Datensätze ausgegeben.

                  Kommentar


                  • #10
                    Dafür solltest du dann keinen JOIN, sondern ein UNION verwenden, da es sich hier um eine Zusammenfassung, keine Beziehung handelt.
                    Ich halte deine Vorgehensweise dennoch für merkwürdig. Ich würde das eher über einen Schalter lösen und Karteileichen per Cronjob alle x Tage/Wochen/Monate löschen.

                    Kommentar


                    • #11
                      Zitat von Manko10 Beitrag anzeigen
                      Dafür solltest du dann keinen JOIN, sondern ein UNION verwenden, da es sich hier um eine Zusammenfassung, keine Beziehung handelt.
                      Danke, UNION ist hier tatsächlich die Lösung, obwohl die NULL für mich unlogisch ist und ich deshalb keine Idee dazu hatte.


                      Zitat von Manko10 Beitrag anzeigen
                      Ich halte deine Vorgehensweise dennoch für merkwürdig. Ich würde das eher über einen Schalter lösen und Karteileichen per Cronjob alle x Tage/Wochen/Monate löschen.
                      Cronjob? Dafür brauche ich eine eigene Maschine oder einen Betreiber der mir das zur Verfügung stellt, das will ich nicht bezahlen

                      Kommentar


                      • #12
                        obwohl die NULL für mich unlogisch ist und ich deshalb keine Idee dazu hatte.
                        Nicht unlogisch. JOINs sind für Beziehungen gedacht und wenn du keine Beziehung formulieren kannst, ist das Ergebnis meist Mist.

                        Cronjob? Dafür brauche ich eine eigene Maschine oder einen Betreiber der mir das zur Verfügung stellt, das will ich nicht bezahlen
                        Die meisten Hoster bieten dir Cronjobs an, die du über Plesk, Confixx oder was auch immer dir dein Hoster serviert, konfigurieren kannst. Ansonsten gibt es auch noch gute externe Anbieter dafür wie z.B. cronjob.de.

                        Dann noch fix den Danke!

                        Kommentar


                        • #13
                          Danke auch!!!

                          Kommentar


                          • #14
                            Dann noch fix den Danke!

                            Kommentar

                            Lädt...
                            X