Avatar billede lademan Novice
14. september 2003 - 12:25 Der er 20 kommentarer og
1 løsning

smart søgefunktion

er der en smart måde, hvorpå man kan dele 1 søgning op i ord og herefter søge på forekomsten af hvert ord i flere tabeller?

så fx søgningen efter "olav nielsen spiser fisk" bliver til en søgning efter forekomsten af mindst 1 af de 4 ord i flere tabeller?
Avatar billede lademan Novice
14. september 2003 - 12:25 #1
slår emailen fra
Avatar billede jakoba Nybegynder
14. september 2003 - 12:40 #2
$soegestreng = "olav nielsen spiser fisk";
$soegestreng_2 = "'" .implode( "','", explode( " ", $soegestreng ) ) ."'";

$sql_kommando = @
    SELECT felt_t1 AS fellesalias, felt2_t1 as fellesalias2
    FROM tabel1
    WHERE feltnavn IN ( $soegestreng_2 )
  UNION
    SELECT felt_t2 AS fellesalias, felt2_t2 as fellesalias2
    FROM tabel2
    WHERE feltnavn IN ( $soegestreng_2 )
  UNION
    SELECT felt_t3 AS fellesalias, felt2_t3 as fellesalias2
    FROM tabel3
    WHERE feltnavn IN ( $soegestreng_2 )
  UNION
    SELECT felt_t4 AS fellesalias, felt2_t4 as fellesalias2
    FROM tabel4
    WHERE feltnavn IN ( $soegestreng_2 )
";

NB:
  datatype i de felter der udtrækkes bør være den samme for hvert fellesalias felt i alle led.
  UNION duer kun i ret nye versioner af mySQL.
  Det er under alle omstændigheder en 'dyr' funktion der kræver en masse server kraft; er du sikker på du har lavet din opdeling i tabeller korrekt?

mvh JakobA
Avatar billede lademan Novice
14. september 2003 - 12:42 #3
nej, det er jeg ikke sikker på..
Avatar billede jakoba Nybegynder
14. september 2003 - 12:42 #4
Ups. det der @-tegn skulle have været et "-tegn:
  $sql_kommando = "
Avatar billede lademan Novice
14. september 2003 - 12:50 #5
1) varchar og text - kan de gå for at være samme type?
2) er den for dyr?
Avatar billede lademan Novice
14. september 2003 - 12:55 #6
hvad betyder "fellesalias"?
Avatar billede Slettet bruger
14. september 2003 - 13:01 #7
hvorfor slår du emailen fra?

Hvis det er for at fjerne krydset i boksen med "E-Mail" behøver du ikke skrive noget, bare fjern krydset og tryk "Udfør"
Avatar billede lademan Novice
14. september 2003 - 13:09 #8
javohl
Avatar billede lademan Novice
14. september 2003 - 13:12 #9
Kan man også lave noget i retning af:

$soegestreng = "olav nielsen spiser fisk";
$soegestreng_2 = "'" .implode( "','", explode( " ", $soegestreng ) ) ."'";

$result = mysql_query("SELECT id, titel FROM artikler WHERE tekst IN ( $soegestreng_2 ) OR titel IN ( $soegestreng_2 )");
Avatar billede lademan Novice
14. september 2003 - 13:22 #10
eller er jeg ude i hampen?
Avatar billede lademan Novice
14. september 2003 - 13:55 #11
er der en der vi svare mig på spørgsmålet om, hvorfor dette ikke virker:

$soegestreng = "olav nielsen spiser fisk";
$soegestreng_2 = "'" .implode( "','", explode( " ", $soegestreng ) ) ."'";

$result = mysql_query("SELECT id, titel FROM artikler WHERE tekst IN ( $soegestreng_2 ) OR titel IN ( $soegestreng_2 )");
Avatar billede lademan Novice
14. september 2003 - 14:30 #12
har jeg lavet en fejl eller virker jakob a's script ikke?
Avatar billede jakoba Nybegynder
14. september 2003 - 15:51 #13
Jeg synes selv det burde virke. og det burde din modifikation også.

noget ante er at dit valg af navne kunne tyde på at ordet blot skal stå et eller andet sted i den 'tekst'. og det er ikke det der testes med IN.
IN tester om hele feltet er lig med et af ordene i søgestrengen.
hvis du vil teste om et af ordene i søgestrengen er et eller andet sted i tekst-feltets værdi må du bruge LIKE. fx:

$soegestreng = "olav nielsen spiser fisk";
$soegestreng_2 = explode( " ", $soegestreng );

$result = mysql_query("
    SELECT id, titel
    FROM artikler
    WHERE (  test LIKE '%" .$soegestreng_2[0] ."%'
          OR test LIKE '%" .$soegestreng_2[1] ."%'
          OR test LIKE '%" .$soegestreng_2[2] ."%'
          OR test LIKE '%" .$soegestreng_2[3] ."%'
          )
      OR (  titel LIKE '%" .$soegestreng_2[0] ."%'
          OR titel LIKE '%" .$soegestreng_2[1] ."%'
          OR titel LIKE '%" .$soegestreng_2[2] ."%'
          OR titel LIKE '%" .$soegestreng_2[3] ."%'
          )
");

men hvis du så samtidig ønsker at gøre det i 4 tabeller på een gang bliver det en meget lang kommando.
Avatar billede lademan Novice
14. september 2003 - 19:03 #14
Når jeg kører denne:

$subject = explode(" ", $subject);

    $result = mysql_query("SELECT id, titel FROM artikler
        WHERE (
            tekst LIKE '%" .$subject[0] ."%'
            OR tekst LIKE '%" .$subject[1] ."%'
            OR tekst LIKE '%" .$subject[2] ."%'
            OR tekst LIKE '%" .$subject[3] ."%'
            )
        OR (
            titel LIKE '%" .$subject[0] ."%'
            OR titel LIKE '%" .$subject[1] ."%'
            OR titel LIKE '%" .$subject[2] ."%'
            OR titel LIKE '%" .$subject[3] ."%'
            )");

Henter den blot alle felter?
Avatar billede lademan Novice
14. september 2003 - 19:10 #15
og det er lige meget hvad jeg sætter subject til..
Avatar billede lademan Novice
14. september 2003 - 19:17 #16
Hmmm, det her kurerer det:

if ($subject[1] == "")$subject[1] = $subject[0];
if ($subject[2] == "")$subject[2] = $subject[0];
if ($subject[3] == "")$subject[3] = $subject[0];

Selvom det godt nok er noget slamkode... :-D
Avatar billede lademan Novice
14. september 2003 - 19:21 #17
er der en smartere måde at tilpasse antallet af $subject[X] efter antallet af ord?
Avatar billede nicklasb Nybegynder
14. september 2003 - 19:25 #18
efter du har delt din streng op i et array med explode kører du bare linien tekst LIKE '%" .$subject[0] ."%' og titel LIKE '%" .$subject[0] ."%' gennem en foreach eller en anden løkke..
Avatar billede lademan Novice
14. september 2003 - 19:27 #19
Damn... der kommer meget kode, når man skal søge i 6 forskellige tabeller...
Avatar billede nicklasb Nybegynder
14. september 2003 - 19:36 #20
hvorfor ligger du det ikke bare i en løkke, og så gemmer et array med de forskellige tabeller der skal søges i?!? Så kan det vel gøres på under 10 linier lige meget hvor mange tabeller og fejlter der skal søges i?
Avatar billede lademan Novice
14. september 2003 - 21:18 #21
Du gider ikke komme med et eksempel hvor du strikker noget kode sammen?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester