Roger: (MySQL) suchwort-suche über mehrere spalten und tabellen

moin!

ich möchte einen suchstring "über eine datenbank jagen". dabei soll username/id, plz, ort und geschlecht(m/w) überprüft werden. der suchstring soll zunächst ersteinmal nur ein wort sein (wird vorher per php so hingebogen).
das geschlecht kann man per radiobutton auswählen und wird somit in der variablen $_POST['sex'] mit übergeben. dieser wert muss aber immer überprüft werden.
hinzu kommt, dass die felder ort, plz und geschlecht noch ein überprüfungsfeld (enum) haben, welches es gestattet (1) diese auszuwerten.
die werte dazu stehen in 2 tabellen (user_id, user_name steht in $db_user, der rest in $db_user_detail).

allerdings bekomme ich kein vernünftiges ergebnis mit meiner sql-syntax. liegt wohl daran, dass ich zu lange draufstarre.

vielleicht hat ja jemand eine idee:
SELECT DISTINCT(u.user_id), u.user_name FROM $db_user AS u, $db_user_detail AS d
WHERE u.user_id LIKE '$search' OR
u.user_name LIKE '$search' OR
(d.plz LIKE '$search' AND d.plz_show LIKE '1') OR
(d.ort LIKE '$search' AND d.ort_show LIKE '1') AND
(d.geschlecht LIKE '".$_POST['sex']."' AND d.geschlecht_show LIKE '1')

gruß.
roger.

--
Dein eigenes Newslettersystem auf deiner Homepage: http://newsletter.maennchen1.de
  1. Hallo!

    allerdings bekomme ich kein vernünftiges ergebnis mit meiner sql-syntax. liegt wohl daran, dass ich zu lange draufstarre.

    Das kann ein logischer Fehler sein. Ist schwer so heraus zu finden, ohne die DB vor sich zu haben.

    Du kannst es mal mit einer ziemlich dreckigen Lösung versuchen.
    http://forum.de.selfhtml.org/archiv/2003/5/47921/

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. moin!

      so recht passen tut das leider nicht, da ja manchmal nur eine spalte und manchmal alle 3 spalten ausgelesen werden dürfen (werden ja mit den "_show" feldern authorisiert...

      na und die struktur der db's is nich weiter schwierig:

      CREATE TABLE lk\_user (
        user\_id int(11) NOT NULL auto_increment,
        user\_name varchar(20) NOT NULL default '',
        [...]
        PRIMARY KEY  (user\_id),
        KEY user\_id (user\_id)
      ) TYPE=MyISAM;

      und

      CREATE TABLE lk\_user\_detail (
        user\_id int(8) NOT NULL default '0',
        plz varchar(10) NOT NULL default '',
        plz\_show enum('0','1') NOT NULL default '0',
        ort varchar(100) NOT NULL default '',
        ort\_show enum('0','1') NOT NULL default '0',
        geschlecht enum('m','w') NOT NULL default 'm',
        geschlecht\_show enum('0','1') NOT NULL default '0',
        [...]
        PRIMARY KEY  (user\_id)
      ) TYPE=MyISAM;

      gruß.
      roger.

      --
      Dein eigenes Newslettersystem auf deiner Homepage: http://newsletter.maennchen1.de
      1. Hallo!

        so recht passen tut das leider nicht, da ja manchmal nur eine spalte und manchmal alle 3 spalten ausgelesen werden dürfen (werden ja mit den "_show" feldern authorisiert...

        Das mußt Du das SQL-Statment dynamisch zusammen pappen.

        MfG, André Laugks

        --
        L-Andre @ gmx.de
  2. yo,

    SELECT DISTINCT(u.user_id), u.user_name FROM $db_user AS u, $db_user_detail AS d
    WHERE u.user_id LIKE '$search' OR
    u.user_name LIKE '$search' OR
    (d.plz LIKE '$search' AND d.plz_show LIKE '1') OR
    (d.ort LIKE '$search' AND d.ort_show LIKE '1') AND
    (d.geschlecht LIKE '".$_POST['sex']."' AND d.geschlecht_show LIKE '1')

    mir ist als erstes aufgefallen, dass die join bedingung der beiden tabellen fehlt. ansonsten wird das karthesische produkt gebildet. zum anderen bin ich mir nicht sicher, ob du bedacht hast, dass das eine AND außerhalb der klammern steht und somit stärker als ein OR bindet, bzw. zuerst ausgeführt wird. keine ahnung ob das von der logik gewollt ist

    Ilja

    1. moin!

      mir ist als erstes aufgefallen, dass die join bedingung der beiden tabellen fehlt. ansonsten wird das karthesische produkt gebildet.

      öhm..., ist join hier notwendig? was ist ein karthesisches produkt?

      zum anderen bin ich mir nicht sicher, ob du bedacht hast, dass das eine AND außerhalb der klammern steht und somit stärker als ein OR bindet, bzw. zuerst ausgeführt wird. keine ahnung ob das von der logik gewollt ist

      ja, ist so gewollt, weil 2 felder abgefragt werden. zum einen der suchausdruck und zum anderen das geschlecht ($_POST['sex']).

      gruß.
      roger.

      --
      Dein eigenes Newslettersystem auf deiner Homepage: http://newsletter.maennchen1.de
      1. yo,

        öhm..., ist join hier notwendig? was ist ein karthesisches produkt?

        nun, ob es notwenig ist, dass solltest du wissen. letztlich hast du zwei tabellen angegeben. und diese werden auf jeden fall miteinander verknüpft. und wenn du keine join-bedingung mit angibts, dann über das karthesische produkt, sprich jeder datensatz der einen tabelle wird mit allen datensätze der anderen tabelle verbunden.

        Ilja

        1. moin!

          achso. klar. danke. hast recht.
          allerdings werden mir trotzalledem alle user angezeigt, egal welche abfrage gerade gemacht wird.

          gruß.
          roger.

          --
          Dein eigenes Newslettersystem auf deiner Homepage: http://newsletter.maennchen1.de
          1. yo,

            allerdings werden mir trotzalledem alle user angezeigt, egal welche abfrage gerade gemacht wird.

            was heist den trotzdem genau, hast du die join bedingung mal eingefügt und wenn ja, wie sieht nun deine query aus ?

            Ilja