Avatar billede Slettet bruger
17. august 2006 - 08:42 Der er 17 kommentarer og
2 løsninger

Query til "string indeholder felt værdi"

Jeg kan søge efter $string i mysql ved at bruge 'like'. Men hvordan søger jeg efter indholdet af et mysql felt i $string?

F.eks.

select * from db where '$string' like field1;
Avatar billede coderdk Praktikant
25. august 2006 - 02:24 #1
Jeg forstår ikke rigtig dit spørgsmål... Mener du:

$felt = 'feltnavn';
$sql = "SELECT * FROM db WHERE $felt LIKE 'netomia%'";

eller mener du:

$navn = 'netomia';
$sql = "SELECT * FROM db WHERE feltnavn LIKE '%$navn%'";

?
Avatar billede Slettet bruger
25. august 2006 - 14:48 #2
Ingen af delene. Jeg vil lave en query som søger efter indholdet af feltx i $string.

Fx:

Felt x i databasen indeholder ordet "rødhætte".

$string = "Der var engang en lille pige som hed rødhætte.";
$sql = "select * from db where '$string' like fieldx;";
Avatar billede coderdk Praktikant
25. august 2006 - 15:08 #3
Det kan du ikke; du skal kende feltnavnene. Lav to queries:

    $searchfor = "noget tekst";

    $sql = "SELECT * FROM db LIMIT 1";
    $qh = mysql_query( $sql ) or die( mysql_error() );
    $row = mysql_fetch_assoc( $qh );
    mysql_free_result( $qh );
    $felter = array();
    foreach( $row as $navn => $tmp )
    {
        $felter[] = $navn . " LIKE '%" . $searchfor . "%'";
    }
    $felter = implode( " OR ", $felter );
    $sql = "SELECT * FROM db WHERE " . $felter;
    $qh = mysql_query( $sql ) or die( mysql_error() );
    while ( $row = mysql_fetch_assoc( $qh ) )
    {
      echo "<pre>"; var_dump( $row ); echo "</pre>";
    }
Avatar billede Slettet bruger
25. august 2006 - 15:28 #4
Jeg tror ikke at du har forstået. Jeg vil ikke søge efter $searchfor i feltet, men efter feltets indhold i $searchfor.

Helt konkret ønsker jeg at man skal kunne abonnere på udvalgte søgeord i nyhedsartikler. En nyhedsartikel ligger i variablen $text. Brugernes søgeord ligger i feltet 'searchfor'.

Så hver gang der tilføjes en ny artikel vil jeg finde de rækker i databasen, hvor feltet 'searchfor' findes i $text.
Avatar billede coderdk Praktikant
25. august 2006 - 15:35 #5
Aha. Det tror jeg nu ikke du kan gøre i ren SQL, der er du nok nødt til at kode dig ud af det...
Avatar billede Slettet bruger
25. august 2006 - 15:39 #6
Det var hvad jeg frygtede. Tak for tiden alligevel.
Avatar billede coderdk Praktikant
25. august 2006 - 15:55 #7
Hmm nu jeg tænker over det kan man måske godt alligevel, hvis du nu HAR sat artiklen ind, så prøv at fyre denne af:

SELECT
  u.userid
FROM
  artikelbase a
INNER JOIN
  bruger_triggers u
ON
  a.tekst LIKE CONCAT( '%', u.word, '%' )
WHERE
  a.id = #DEN ID DU ARTIKLEN HAR#

Her antager jeg at bruger_triggers indeholder dine brugeres søgeord, såsom:

id int auto_increment
userid int
word varchar(50)
Avatar billede Slettet bruger
31. august 2006 - 20:20 #8
Hov, fejl i min sidste besked - men sqlen giver stadig fejl:

SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch.nxid,news_watch.word
ON
  news.text LIKE CONCAT( '%',news_watch.word,'%' )
WHERE
  news.newsid = 5
Avatar billede Slettet bruger
31. august 2006 - 20:21 #9
Nå, min sidste besked blev slet ikke skrevet... dumme eksperten.dk.

Tabel "news" indeholder felterne newsid og text
Tabel "news_watch" indeholder felterne nxid og word
Avatar billede coderdk Praktikant
31. august 2006 - 21:38 #10
Prøv:

SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch
ON
  news.text LIKE CONCAT( '%',news_watch.word,'%' )
WHERE
  news.newsid = 5
Avatar billede Slettet bruger
31. august 2006 - 22:04 #11
Sørme så! :) hvordan giver jeg dig point for det?
Avatar billede coderdk Praktikant
31. august 2006 - 23:30 #12
Du har allerede givet mig halvdelen af pointene - Det er ok :)
Avatar billede Slettet bruger
13. august 2007 - 18:27 #13
Jeg kan vel ikke lokke dig til at kigge på et lille ekstra spørgsmål? :)

Din query virkede, men nu ønsker jeg mulighed for at bruge fulltext index (match against). Jeg får dog fejl lige meget hvad jeg prøver... f.eks:


SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch
ON
  match news.text against CONCAT( '%',news_watch.word,'%' )
WHERE
  news.newsid = 5


------------------------------

SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch
WHERE
  match news.text against CONCAT(news_watch.word)
Avatar billede coderdk Praktikant
13. august 2007 - 21:44 #14
er det ikke bare

SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch
WHERE
  match news.text against news_watch.word


eller

SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch
WHERE
  match (news.text) against news_watch.word
Avatar billede Slettet bruger
13. august 2007 - 23:37 #15
Nope... følgende virker:

SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch
WHERE
  match (news.text) against ('find-dette')

men denne gør ikke:

SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch
WHERE
  match (news.text) against (news_watch.word)

Heller ikke selvom jeg har teksten "find-dette" gemt i news_watch.word, og det derfor burde give den samme query.
Avatar billede coderdk Praktikant
14. august 2007 - 00:06 #16
Det kan være at den ikke anser et felt som en expression?
Avatar billede Slettet bruger
14. august 2007 - 00:42 #17
Øh... lyder sandsynligt. Men er der en løsning til det? :)
Avatar billede coderdk Praktikant
14. august 2007 - 01:00 #18
Prøv:

SELECT
  news_watch.nxid
FROM
  news
INNER JOIN
  news_watch
WHERE
  match (news.text) against (CONCAT('',news_watch.word))
Avatar billede Slettet bruger
14. august 2007 - 06:00 #19
Desværre...

#1210 - Incorrect arguments to AGAINST
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
Computerworld tilbyder specialiserede kurser i database-management

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