(MySQL) suchwort-suche über mehrere spalten und tabellen
Roger
- datenbank
0 André Laugks0 Roger
0 Ilja
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.
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
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.
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
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
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.
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
moin!
achso. klar. danke. hast recht.
allerdings werden mir trotzalledem alle user angezeigt, egal welche abfrage gerade gemacht wird.
gruß.
roger.
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