verschiedene datenklassen unter einen hut bekommen

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

  • verschiedene datenklassen unter einen hut bekommen

    es ist ein schwieriges Problem: Bestimmte Einträge sollen ausgeben werden und zwar nach einem Schluessel. Der Schluessel ist in einer datenbank gespeichert, so:

    id kategorie_1 kategorie_2 kategorie_3 kategorie_4 kategorie_5 kategorie_6 kategorie_7 kategorie_8 relid
    -- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----
    1 101 0 0 0 0 0 0 0 1
    2 101 104 0 0 0 0 0 0 2
    3 101 0 0 0 0 0 0 0 3
    4 101 0 0 0 0 0 0 0 4
    5 103 110 111 105 0 0 0 0 5

    die abfrage ist so realisiert:

    $sql = "SELECT
    logindaten.rechte,
    beschreibunghotel.hotel_bild,
    (...)
    FROM
    logindaten,
    beschreibunghotel,
    adressdaten,
    (..)
    WHERE
    (kategorienverzeichnis.kategorie_1 = '".$_SESSION['kategorie']."')
    OR (kategorienverzeichnis.kategorie_2 = '".$_SESSION['kategorie']."')
    OR (kategorienverzeichnis.kategorie_3 = '".$_SESSION['kategorie']."')
    OR (kategorienverzeichnis.kategorie_4 = '".$_SESSION['kategorie']."')
    OR (kategorienverzeichnis.kategorie_5 = '".$_SESSION['kategorie']."')
    OR (kategorienverzeichnis.kategorie_6 = '".$_SESSION['kategorie']."')
    OR (kategorienverzeichnis.kategorie_7 = '".$_SESSION['kategorie']."')
    OR (kategorienverzeichnis.kategorie_8 = '".$_SESSION['kategorie']."')

    die abfrage bringt aber immer nur zwei Einträge auch wenn dort kein entsprechender schluessel vorhanden ist

  • #2
    Also, der Query sieht nicht allzu schön aus... Schau dir mal im SQL-Forum den Sticky an über Joins: http://php-resource.de/forum/showthr...threadid=28292

    Und dann solltest du dir Gedanken über dein Datenbank-Design machen. Was ist, wenn eine weitere Kategorie dazukommt? Arbeite lieber mit Hilfstabellen, das Stichwort "Normalisierung" sei mal in den Raum geworfen.

    Ansonsten ist es recht schwierig, Hilfestellung zu geben, ohne die entsprechenden Zusammenhänge zwischen den Tabellen zu kennen.

    Kommentar


    • #3
      Re: ausgabe läuft nicht wie erwartet

      Optimierung (kein Bugfix, aber mit Sicherheit besser als diese OR-Clause Oo)
      PHP-Code:
      $sql "SELECT
                logindaten.rechte,
                beschreibunghotel.hotel_bild, 
              (...)
      FROM
              logindaten,
              beschreibunghotel,
              adressdaten,
             (..)

      WHERE . '" 
      $_SESSION['kategorie'] . "' IN 
      (
      kategorienverzeichnis.kategorie_1, 
      kategorienverzeichnis.kategorie_2, 
      kategorienverzeichnis.kategorie_3, 
      kategorienverzeichnis.kategorie_4, 
      kategorienverzeichnis.kategorie_5,
      kategorienverzeichnis.kategorie_6, 
      kategorienverzeichnis.kategorie_7, 
      kategorienverzeichnis.kategorie_8

      abgesehen davon ist das DB-Design wirklich komisch -.-

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        geht immer noch nicht

        vielen lieben dank für die optimierung und die Tipps

        allerdings funktioniert es immer noch nicht.

        zur info: es können nur bis zu acht kategorien eingetragen werden. Wenn eine Übereinstimmung der werte da ist soll eine ausgabe erfolgen. Dass die Daten zueinander finden, wird des weiteren uber eine relative id (hier relid) sicher gestellt. So viel dazu. leider weiss ich jetzt nicht was so komisch an meinem datenbankdesign sein soll. ich arbeite eben lieber konkret und nicht so abstrakt.


        Kommentar


        • #5
          ok es funzt jetzt

          hab aber noch nicht alle probleme gelöst. Die Frage ist, wie man unterschiedliche Datenklassen unter einen hut bekommt. Es soll nämlich so sein, dass hoteleinträge, premiumeinträge (z. B. Kosmetikstudios) und normale einträge (kostenlos z. B. für Kosmetikstudios) nur mit adressdaten ausgelesen werden. und dann sollen natürlich die werte zusammenpassen.
          eben über die relid.

          Wie auch immer das hier funktioniert: es ist eben nur eine datenklasse vorhanden:

          $sql = "SELECT
          logindaten.rechte,
          beschreibunghotel.hotel_bild,
          adressdaten.firmenname,
          DATE_FORMAT(adressdaten.datum, '".DATE_STYLE."') AS datum,
          beschreibunghotel.profil,
          preisleistunghotel.preiseinzel,
          preisleistunghotel.preisdoppel,
          preisleistunghotel.preisappartment,
          preisleistunghotel.fruehstueck,
          preisleistunghotel.halbpension,
          preisleistunghotel.vollpension,
          kontaktdaten.url,
          kontaktdaten.email,
          kontaktdaten.telefon,
          beschreibunghotel.relid
          FROM
          logindaten,
          beschreibunghotel,
          adressdaten,
          preisleistunghotel,
          kontaktdaten,
          kategorienverzeichnis
          WHERE
          '".$_SESSION['kategorie']."' IN
          (kategorienverzeichnis.kategorie_1,
          kategorienverzeichnis.kategorie_2,
          kategorienverzeichnis.kategorie_3,
          kategorienverzeichnis.kategorie_4,
          kategorienverzeichnis.kategorie_5,
          kategorienverzeichnis.kategorie_6,
          kategorienverzeichnis.kategorie_7,
          kategorienverzeichnis.kategorie_8)
          AND (logindaten.id = kategorienverzeichnis.relid)
          AND (beschreibunghotel.relid = kategorienverzeichnis.relid)
          AND (adressdaten.relid = kategorienverzeichnis.relid)
          AND (preisleistunghotel.relid = kategorienverzeichnis.relid)
          AND (kontaktdaten.relid = kategorienverzeichnis.relid)

          LIMIT
          ".$offset.",".LIMIT_NUM.";";

          Kommentar


          • #6
            verschiedene datenklassen unter einen hut bekommen

            folgendes skript funktioniert nicht da für eine der zwei Datenklassen keine Werte da sind. wie bekomme ich das unter einen hut mit "class"


            $sql = "SELECT
            logindaten.rechte,
            beschreibunghotel.hotel_bild,
            adressdaten.firmenname,
            DATE_FORMAT(adressdaten.datum, '".DATE_STYLE."') AS datum,
            beschreibunghotel.profil,
            preisleistunghotel.preiseinzel,
            preisleistunghotel.preisdoppel,
            preisleistunghotel.preisappartment,
            preisleistunghotel.fruehstueck,
            preisleistunghotel.halbpension,
            preisleistunghotel.vollpension,
            kontaktdaten.url,
            kontaktdaten.email,
            kontaktdaten.telefon,
            beschreibunghotel.relid,
            beschreibungstudio.typ,
            beschreibungstudio.profil,
            beschreibungstudio.relid
            FROM
            logindaten,
            beschreibunghotel,
            adressdaten,
            preisleistunghotel,
            kontaktdaten,
            kategorienverzeichnis,
            beschreibungstudio
            WHERE
            '".$_SESSION['kategorie']."' IN
            (kategorienverzeichnis.kategorie_1,
            kategorienverzeichnis.kategorie_2,
            kategorienverzeichnis.kategorie_3,
            kategorienverzeichnis.kategorie_4,
            kategorienverzeichnis.kategorie_5,
            kategorienverzeichnis.kategorie_6,
            kategorienverzeichnis.kategorie_7,
            kategorienverzeichnis.kategorie_8)
            AND (logindaten.id = kategorienverzeichnis.relid)
            AND (beschreibunghotel.relid = kategorienverzeichnis.relid)
            AND (adressdaten.relid = kategorienverzeichnis.relid)
            AND (preisleistunghotel.relid = kategorienverzeichnis.relid)
            AND (kontaktdaten.relid = kategorienverzeichnis.relid)

            LIMIT
            ".$offset.",".LIMIT_NUM.";";

            Kommentar


            • #7
              kannst du dein Problem etwas genauer erläutern? Ich habe keinen Plan, was du willst. Auch machst du es einem nicht besonders leicht deinen Quelltext zu lesen. Bitte die Regeln befolgen

              Kommentar


              • #8
                es gibt...

                In meiner Seite gibt es premiumeinträge oder 'normale' einträge für kosmetikstudio oder dergleichen und hoteleinträge für hotels. In allen drei Datenklassen soll gesucht werden können und zwar nach bestimmten Angeboten, die über ein kategorienverzeichnis angewählt werden können. Nun sollen die drei Datenklassen in der Ausgabe unterschiedlich ausfallen aber eben gemischt ausgegeben werden können. Mit dem oben genannten Skript scheint es nicht zu gehen, da für eine der zwei Datenklassen keine Werte da sind.
                Ich hoffe damit wird es verständlicher was ich machen will.

                Kommentar


                • #9
                  Nö.

                  Wie viele "Datenklassen" sind es jetzt wirklich. Und wie definierst sich der Begriff "Datenklasse" überheupt?

                  Kommentar


                  • #10
                    es gibt drei datenklassen

                    mit datenklassen meine ich einfach ein Set von daten (z.B Adresse, Telefon etc.) die zusammengehören. Das problem ist einfach nur dass es nicht funktioniert wenn ein Wert einer datenklasse nicht existiert bzw. wenn hierfür noch keine einträge vorhanden sind

                    Kommentar


                    • #11
                      Du meinst also, dass die WHERE-Bedingung nicht erfüllt wird?

                      Kommentar


                      • #12
                        Mit Doppelpostings brauchst du hier bitte gar nicht erst anfangen. und zusammenführ.

                        Kommentar


                        • #13
                          vielleicht

                          ja vielleicht. die where-bedingung gilt ja für den ganzen datensatz und der enthält tabellenwerte, die nicht vorhanden sind

                          Kommentar


                          • #14
                            und wo ist dein problem?

                            Kommentar


                            • #15
                              ich versuch es mal schematisch darzustellen

                              es gibt die datenklasse a, b und c die so ausgelesen werden sollen

                              select
                              x.a,
                              y.b,
                              z.c
                              from
                              x,
                              y,
                              z
                              WHERE
                              x.id = w.id AND
                              y.id = w.id AND
                              z.id = w.id

                              w ist das kategorienverzeichnis und der wert z.c (von der dritten Datenklasse) existiert nicht und führt deshalb zu keiner ausgabe.

                              Kommentar

                              Lädt...
                              X