Spalten sich gegenseitig vergleichen lassen ...

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

  • Spalten sich gegenseitig vergleichen lassen ...

    Hallo an alle.

    Es existiert eine Tabelle, die folgende Spalten besitzt:
    user_id = ID des Benutzers
    user_nick = Nickname des Benutzers
    user_bday = sein Geburtstag (im Format JJJJ-MM-TT)
    user_plz = seine PLZ (steht 5-stellig drin, es werden aber nur die ersten beiden dargestellt)
    user_gender = sein Geschlecht ("m" oder "w")
    srch_gender = Geschlecht des potentiellen Partners ("m" oder "w")
    srch_plz = der Postleitzahlbereich des Gesuchten (0 - 9)
    srch_agefrom = (Alter von)
    srch_ageto = (Alter bis)
    user_visible = (0 bedeutet "Profil versteckt", 1 bedeutet "Profil nicht versteckt"

    Der Nutzer legt in den srch_ - Spalten seine Suchkriterien ab, damit er diese nicht immer neu eingeben muss und diese sich sowieso so gut wie nie ändern.

    Die SQL-Anweisung soll(te) jetzt die Einträge auslesen, wo beispielsweise user_gender und srch_gender gleich sind, sprich: Die Spalten innerhalb einer Tabelle gegenvergleichen (wenn soetwas überhaupt geht).

    Ich vermute, dass ich LEFT JOIN benutzen muss, was ungefähr so aussehen müsste:
    PHP-Code:
    SELECT u.user_idu.user_nicku.user_bdayLEFT(u.user_plz2), u.user_genderu.user_visible
           s
    .srch_genders.srch_plzs.srch_agefroms.srch_ageto
    FROM user u
    LEFT JOIN user s
    WHERE u
    .user_id!='".$_SESSION['user_id']."' # wichtig, damit nicht der eigene Eintrag mitgeprüft wird
    AND u.user_visible='1'
    AND DATE_FORMAT(u.user_bday'%Y') <= s.srch_agefrom AND DATE_FORMAT(user_bday'%Y') >= s.srch_ageto
    AND LEFT(u.user_plz1) = s.srch_plz
    AND u.user_gender s.srch_gender
    ORDER BY u
    .user_nick 
    Habe ich, was die SQL-Anweisung betrifft, richtig vermutet? Ich weiß, ich könnte es ja einfach mal ausprobieren, aber das beantwortet dann meine Frage nicht: Kann man Spalten EINER Tabelle in einer SELECT-Anweisung miteinander vergleichen?

    Danke im voraus.

    Innuendo

  • #2
    falls ich dich richtig verstehe ...

    ja, das geht ...

    wenn du den join benutzt, kannst du einige der bedingungen aus dem WHERE in den ON bereich des JOINS tun ...
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      Original geschrieben von derHund
      kannst du einige der bedingungen aus dem WHERE in den ON bereich des JOINS tun ...
      Ich möchte nicht unhöflich erscheinen, aber kannst Du mir auch sagen, welche? Diese "LEFT JOIN"-Geschichte ist für mich bis heute ein Buch mit sieben Siegeln.

      Kommentar


      • #4
        Folgende Anweisung liefert mir nun einen leeren Bildschirm, obwohl es Treffer geben müsste:

        PHP-Code:
        $searchQuery "SELECT u.user_id, u.user_nick, u.user_bday, LEFT(u.user_plz, 2), u.user_genderme, u.user_visible, s.srch_gender, s.srch_plz, s.srch_agefrom, s.srch_ageto ";
        $searchQuery.= "FROM user u ";
        $searchQuery.= "LEFT JOIN user s ON u.user_genderme = s.srch_gender ";
        $searchQuery.= "WHERE u.user_id!='".$_SESSION['user_id']."' ";
        $searchQuery.= "AND u.user_visible='1' ";
        $searchQuery.= "AND DATE_FORMAT(u.user_bday, '%Y') <= s.srch_agefrom AND DATE_FORMAT(u.user_bday, '%Y') >= s.srch_ageto ";
        $searchQuery.= "AND LEFT(u.user_plz, 1) = s.srch_plz ";
        $searchQuery.= "ORDER BY u.user_nick "

        Kommentar


        • #5
          nimm mal alles ab WHERE (einschließlich) raus und probier das in phpmyadmin
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Original geschrieben von mrhappiness
            probier das in phpmyadmin
            Dass ich da noch nicht drauf gekommen bin.

            In phpmyadmin gibt er die Datensätze so aus, wie er sie ausgeben soll ("finde alle Datensätze, wo das gesuchte Geschlecht mit dem vom Nutzer gewählten übereinstimmt").

            Kommentar


            • #7
              Original geschrieben von Innuendo
              Dass ich da noch nicht drauf gekommen bin.

              In phpmyadmin gibt er die Datensätze so aus, wie er sie ausgeben soll
              und da ging die sonne auf *g*
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Noch nicht. Wenn ich nämlich die WHERE-Anweisung dranhänge, gibt er mir wieder nichts aus.

                Bisherige Anweisung:
                PHP-Code:
                SELECT 
                  u
                .user_idu.user_nicku.user_bday
                  
                LEFT(u.user_plz2), 
                  
                u.user_gendermeu.user_visible
                  
                s.srch_genders.srch_plzs.srch_agefroms.srch_ageto 
                FROM 
                  user u 
                  INNER JOIN user s ON u
                .user_genderme s.srch_gender 
                WHERE 
                  LEFT
                (u.user_plz1) = s.srch_plz 
                EDIT:
                umerbrochen by mrhappiness
                Zuletzt geändert von mrhappiness; 08.02.2004, 23:30.

                Kommentar


                • #9
                  poste mal nen screenshot von nem datensatz, der die bedingung erfüllt
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Ich habe gerade einen kleinen Fehler in meinem Skript entdeckt. Schreibe Dir gleich, ob jetzt alles klappt.

                    Kommentar


                    • #11
                      Ist es normal, dass er bei 1.000 eingetragenen Nutzern 13 Sekunden braucht, um 13 Treffer zu finden?

                      Hier mal die Tabellenstruktur:
                      Code:
                      CREATE TABLE `user` (
                        `user_id` varchar(8) NOT NULL default '',
                        `user_nick` varchar(30) NOT NULL default '',
                        `user_pass` varchar(32) NOT NULL default '',
                        `user_vorname` varchar(40) NOT NULL default '',
                        `user_nachname` varchar(40) NOT NULL default '',
                        `user_email` varchar(150) NOT NULL default '',
                        `user_bday` date NOT NULL default '0000-00-00',
                        `user_size` int(3) NOT NULL default '0',
                        `user_famstat` int(1) NOT NULL default '0',
                        `user_genderme` char(1) NOT NULL default '',
                        `user_smoker` int(1) NOT NULL default '0',
                        `user_hobbies` varchar(200) NOT NULL default '',
                        `user_kids` int(1) NOT NULL default '0',
                        `user_pic` varchar(12) NOT NULL default '',
                        `user_plz` varchar(5) NOT NULL default '0',
                        `user_ort` varchar(100) NOT NULL default '',
                        `user_str` varchar(150) NOT NULL default '',
                        `srch_gender` char(1) NOT NULL default '',
                        `srch_agefrom` int(4) NOT NULL default '0',
                        `srch_ageto` int(4) NOT NULL default '0',
                        `srch_sizefrom` int(3) NOT NULL default '0',
                        `srch_sizeto` int(3) NOT NULL default '0',
                        `srch_plz` char(1) NOT NULL default '',
                        `srch_smoker` int(1) NOT NULL default '0',
                        `user_createon` date NOT NULL default '0000-00-00',
                        `user_active` int(1) NOT NULL default '0',
                        `user_member` int(1) NOT NULL default '0',
                        `user_visible` int(1) NOT NULL default '1',
                        `user_lastlogin` date NOT NULL default '0000-00-00',
                        PRIMARY KEY  (`user_id`),
                        KEY `user_bday` (`user_bday`),
                        KEY `user_size` (`user_size`),
                        KEY `user_nick` (`user_nick`),
                        KEY `user_plz` (`user_plz`)
                      ) TYPE=MyISAM;
                      Zuletzt geändert von ; 08.02.2004, 23:51.

                      Kommentar


                      • #12
                        du kannst die bedingung, die jetzt in der where steht, in den join tun, dann sollte es zumindest schneller gehn
                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          Mittlerweile habe ich es wieder auf 2 Tabellen umgestellt, in einer die Nutzerdaten, in der anderen die Suchkriterien.

                          Danke dennoch.

                          Kommentar

                          Lädt...
                          X