CMS nach Regionen ...

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

  • CMS nach Regionen ...

    Hallo,

    ich habe ein kleines CMS ...

    Die Benutzertabelle users hat ein Feld mit dem Namen regionen.
    Dort drin stehen IDs der Tabelle regionen ...

    Sieht so aus:
    :1: :3: :8:

    Die werte zwischen den Doppelpunkten sind die IDs der Regionen (Tabelle Regionen)

    Jetzt die Frage:

    Es gibt die Tabellel news ebenfalls mit dem Feld regionen

    Mein Ziel ist es nur News auszulesen, die man auch möchte (deshalb die Regionen die jeder Benutzer auswählen kann) ...

    Wie würde da der SELECT Befehl lauten, ich krieg das leider nicht hin ?
    Freue mich über jede Hilfe

    Hendrik

  • #2
    A Visual Explanation of SQL Joins
    Wir werden alle sterben

    Kommentar


    • #3
      Da steig ich nicht ganz durch

      Habe jetzt mal folgenden Befehl eingegeben:
      <?

      include("config.php");

      $query=mysql_query("SELECT * FROM events INNER JOIN kunden ON events.regionen = kunden.regionen", $conn);
      while($fetch=mysql_fetch_array($query)) {
      echo "$fetch[name]\n";
      }
      ?>

      Folgender Fehler erscheint dann:
      Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/web1584/html/asd.php on line 6

      Kommentar


      • #4
        mysql_error() würde dir den Fehler zeigen.

        Tipp:
        Verwende Aliase.
        Und SELECT * ist böse.
        Wir werden alle sterben

        Kommentar


        • #5
          Ich komme einfach nicht weiter ...

          Um euch das Problem nochmals zu erklären habe ich hier den SQL Export rein getan:
          PHP-Code:
          Auszug User:

          CREATE TABLE IF NOT EXISTS `users` (
            `
          IDint(11NOT NULL AUTO_INCREMENT,
            `
          nickvarchar(50NOT NULL DEFAULT '',
            `
          landkreisvarchar(50NOT NULL DEFAULT '',
            
          PRIMARY KEY (`ID`)
          ENGINE=MyISAM  DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=;

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

          INSERT INTO `kunden` (`ID`, `nick`, `landkreis`) VALUES
          (1'Hendrik'':10: :13: :7: :6: :5: :2: :1: :12: :8: :3: ');

          ----

          Auszug Events:

          CREATE TABLE IF NOT EXISTS `events` (
            `
          idint(11NOT NULL AUTO_INCREMENT,
            `
          nametext NOT NULL,
            `
          plztext NOT NULL,
            `
          orttext NOT NULL,
            `
          datumtext NOT NULL,
            `
          regionentext NOT NULL,
            
          PRIMARY KEY (`id`)
          ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=18144 ;

          --
          -- 
          Daten für Tabelle `events`
          --

          INSERT INTO `events` (`id`, `name`, `plz`, `ort`, `datum`, `regionen`) VALUES
          (5295'Rockparty''55116''Mainz''10.02.2010'':6:'); 
          Jeder User kann verschiedene Regionen wählen ...

          Das Event befindet sich in der Region 6

          Ich möchte folgendes Ergebnis erzielen:
          - nur die Events anzeigen wenn der User die Region (in diesem Fall 6) im Profil aktiviert hat.
          Zuletzt geändert von Hendrik33; 17.08.2010, 11:40.

          Kommentar


          • #6
            ':10: :13: :7: :6: :5: :2: :1: :12: :8: :3: '
            Ein Verstoß gegen die erste Normalform!
            Siehe:
            Ein Relationstyp ist in der 1. Normalform, wenn alle Attribute maximal einen Wert haben. Am Kreuzungspunkt einer Spalte mit einer Reihe darf also maximal ein Datenwert stehen. Das Nichtvorhandensein von Daten ist zulässig.

            Mit anderen Worten: Wiederholungsgruppen sind nicht erlaubt.
            aus: Die 5 Normal Formen

            Du benötigst für eine n:m Relation eine weitere Tabelle!
            Wir werden alle sterben

            Kommentar


            • #7
              Anstatt ':3:...' etc.. müsste es dann '{3,2,4}' heißen oder was?

              Kommentar


              • #8
                Nein, du brauchst eine dritte Tabelle, um das normalisiert umsetzen zu können. Google doch mal nach n:m-Relation, da findest du viele Erklärungen.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Hab schon gegoogelt finde aber nichts was verständlich für mich erklärt ist.

                  Ich verstehe das jetzt so:

                  Ich brauche eine Tabelle

                  users_regionen
                  mit den feldern id, user, regionen

                  aber dann steht doch dort in den regionen wieder mehrere werte drin ??

                  Kommentar


                  • #10
                    Zitat von Hendrik33 Beitrag anzeigen
                    aber dann steht doch dort in den regionen wieder mehrere werte drin ??
                    Nein, nicht mehrere Werte sondern mehrere Datensätze:

                    1, 25, 2
                    2, 25, 4
                    3, 25, 5
                    4, 25, 12
                    5, 34, 2
                    6, 34, 8
                    7, 34, 9


                    User 25 hat die Regionen 2, 4, 5, 12 und User 34 die Regionen 2, 8, 9. Die Region 2 hat ihrerseits beide Benutzer zugeordnet.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Das habe ich jetzt verstanden alles klar!

                      Nur jetzt hakt es wieder und ich komme nich weida

                      Kommentar


                      • #12
                        Zitat von Hendrik33 Beitrag anzeigen
                        Nur jetzt hakt es wieder und ich komme nich weida
                        Je mehr du daraus ein Geheimnis machst, desto geringer sind die Chancen auf Hilfe.
                        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                        Super, danke!
                        [/COLOR]

                        Kommentar


                        • #13
                          So hier nochmal alles was damit zusammenhängt:

                          PHP-Code:
                          Auszug User:

                          CREATE TABLE IF NOT EXISTS `users` (
                            `
                          IDint(11NOT NULL AUTO_INCREMENT,
                            `
                          nickvarchar(50NOT NULL DEFAULT '',
                            
                          PRIMARY KEY (`ID`)
                          ENGINE=MyISAM  DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=;

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

                          INSERT INTO `users` (`ID`, `nick`) VALUES
                          (1'Hendrik');

                          ----

                          Auszug User Regionen:

                          CREATE TABLE IF NOT EXISTS `users_regionen` (
                            `
                          idint(11NOT NULL AUTO_INCREMENT,
                            `
                          uservarchar(50NOT NULL DEFAULT '',
                            `
                          regionvarchar(50NOT NULL DEFAULT '',
                            
                          PRIMARY KEY (`ID`)
                          ENGINE=MyISAM  DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=;

                          --
                          -- 
                          Daten für Tabelle `users_regionen`
                          --

                          INSERT INTO `users_regionen` (`ID`, `user`, `region`) VALUES
                          (1'1''1');

                          ----

                          Auszug Events:

                          CREATE TABLE IF NOT EXISTS `events` (
                            `
                          idint(11NOT NULL AUTO_INCREMENT,
                            `
                          nametext NOT NULL,
                            `
                          datumtext NOT NULL,
                            `
                          locationtext NOT NULL,
                            
                          PRIMARY KEY (`id`)
                          ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=18144 ;

                          --
                          -- 
                          Daten für Tabelle `events`
                          --

                          INSERT INTO `events` (`id`, `name`, `datum`, `location`) VALUES
                          (5295'Rockparty'''10.02.2010', '1');  

                          ---

                          Auszug Locations:

                          CREATE TABLE IF NOT EXISTS `locations` (
                            `id` int(11) NOT NULL AUTO_INCREMENT,
                            `name` text NOT NULL,
                            `region` text NOT NULL,
                            PRIMARY KEY (`id`)
                          ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=844 ;

                          --
                          -- Daten für Tabelle `locations`
                          --

                          INSERT INTO `locations` (`id`, `name`, `region`) VALUES
                          (1, '
                          Club...', '3'); 
                          Erklärung:
                          - Es ist ein Benutzer angemeldet, dieser kann wie oben schon beschrieben mehrere Regionen im Profil anwählen
                          - Die Regionen werden in der Tabelle users_regionen gespeichert, pro Region ein Dateneintrag
                          - Jetzt gibts es einen Eventkalender mit diversen Events, der User soll nur die Events sehen die in seiner Region sind.
                          - die Events sind aber nicht selbst mit einem Feld region belegt sondern haben nur das Feld location (verweisst mit Id auf extra tabelle)
                          - In der Location Tabelle gibt es dann neben den Details zur Location ein Feld mit dem namen region
                          - Dort steht wiederum eine Zahl ... (verweisst auf die Tabelle regionen)

                          Was ich suche ist den SQL Befehl um das so auslesen zu können!
                          Hoffe das hat jeder verstanden
                          Zuletzt geändert von Hendrik33; 17.08.2010, 13:14.

                          Kommentar


                          • #14
                            Dazu musst du dich als nächstes über Joins informieren. Combie hatte dir diesbezüglich schon etwas empfohlen: Coding Horror: A Visual Explanation of SQL Joins

                            Fragen zu deinem DB-Design:
                            • Warum verwendest du MyISAM und nicht InnoDB?
                            • Warum sind users_regionen.user und users_regionen.region varchar, wenn sie doch auf die jeweilige ID (int) verweisen?
                            • Warum ist locations.region vom Typ text, wenn dort doch auch nur die Regions-ID als int drin steht?
                            • Warum ist events.datum vom Typ text, wenn MySQL dir doch so tolle Datumstypen wie z. B. datetime anbietet?
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar


                            • #15
                              1. phpMyAdmin hat das so eingestellt
                              2. Hab das nur so reingetippt hier ... Die Typen sind natürlich nicht korrekt! Müssen int sein
                              3. Aller gleiches Spiel
                              4. Das weiß ich auch nicht, Dort ist einfach nur ein Timestamp eingespeichert ...

                              Ich probier jetzt mal rum, hab zwar keinen Plan wie das mit Joins funktionieren soll.
                              Hast du vllt einen Ansatz tipp für mich?

                              Aktuell:
                              Habs gepackt

                              SELECT *
                              FROM events , locations, users_regionen
                              WHERE events.loclink = locations.id
                              AND kunden_regionen.region = locations.gebiet
                              AND kunden_regionen.user = der benutzer ...;
                              hat der Code noch irgendwelche Verbesserungen?
                              in phpmyAdmin gehts jedenfalls und es kommen auch nur die events aus dem gebiet ...
                              Zuletzt geändert von Hendrik33; 17.08.2010, 14:10.

                              Kommentar

                              Lädt...
                              X