Avatar billede 1409 Praktikant
23. april 2003 - 15:44 Der er 9 kommentarer og
1 løsning

Where.... and-problemer i MySQL

Har en MySQL med disse tabeller:
CREATE TABLE tekst (
  id mediumint(5) unsigned NOT NULL auto_increment,
  dato date NOT NULL default '0000-00-00',
  overskr text NOT NULL,
  tekst text NOT NULL,
  PRIMARY KEY  (id),
  KEY dato (dato),
  KEY id (id)
) TYPE=MyISAM;

CREATE TABLE homepages (
  id mediumint(4) unsigned NOT NULL auto_increment,
  http char(100) NOT NULL default '',
  tekst_id mediumint(5) unsigned NOT NULL default '0',
  PRIMARY KEY (id)
) TYPE=MyISAM;

Til de enkelte tekster kan der tilknyttes links.
Jeg kan udtrække og vise teksterne med følgende script, men kun i tilfælde af, at der også er tilknyttet min. et link. Hvis der ingen links er tilknyttet vises der ingenting overhovedet.
Jeg vil tro at problemet ligger i WHERE-klausulen, men kan simpelthen ikke gennemskue, hvordan min SELECT burde være.

$id=$_GET["id"];

$query = mysql_query("SELECT t.id AS tid,dato,overskr,tekst,tekst_id,http
FROM tekst t, homepages
WHERE  t.id='$id' AND tekst_id='$id' ");

//hente tekst + evt. forsalg og img-src
$r = mysql_fetch_array($query);
WHILE($r) {
    $id = $r["tid"];
    $dato = $r["dato"];
    $overskr = $r["overskr"];
    $tekst = $r["tekst"];
   
    //kalde funktioner fra common.php til dato-konvertering
    us_dk($dato);
   
    //vise koncert + evt. forsalg og img-src
    ECHO "<TR><TD><DIV CLASS=fed>$dato $overskr</DIV><BR></TD></TR>\n";
    ECHO "<TR><TD>$tekst<BR></TD></TR>\n";
   
    //hente http's fra db
    WHILE($id == $r["tekst_id"]) {
        $homepage = $r["http"];
       
        //homepage eller ej
        IF(strlen($homepage)>"NULL") {
        ECHO "<TR><TD><BR>Se hjemmeside: <A HREF=\"http://$homepage\" TARGET=\"_blank\">$homepage</A><BR></TD></TR>\n";
        }
        ELSE {
            ECHO "\n";
        }
        $r = mysql_fetch_array($query);
    }
}
?>

På forhånd tak!
Avatar billede erikjacobsen Ekspert
23. april 2003 - 16:07 #1
Måske  -  utestet:

$query = mysql_query("SELECT t.id AS tid,dato,overskr,tekst,tekst_id,http
FROM tekst t LEFT JOIN homepages ON t.id=homepages.test_id
WHERE  t.id='$id'");
Avatar billede 1409 Praktikant
23. april 2003 - 22:33 #2
Desværre, præcis det samme resultat :-(
Der vises kun noget, hvis der er matchende records i tekst og homepages - hvilket ikke er meningen....
Avatar billede erikjacobsen Ekspert
23. april 2003 - 22:38 #3
Nåh, jamen hvad er der så i vejen for at lave to select sætninger ?
Avatar billede steench Nybegynder
24. april 2003 - 13:29 #4
Hej

Dit problem ligger, helt korrekt i, din select sætning.
Det er 'and' der giver dig problemet.
Det giver ingen mening at sætte data sammen fra 2 tabeller, hvis der ikke findes en matchende id.
Hvis du skal have data ud fra tabellen 'homepages' uden der findes noget matchende id i tabellen 'tekst', kunne du evt. tjekke i 'tekst' om der findes noget der matcher din id, inden du laver din join.

/Steen
Avatar billede 1409 Praktikant
24. april 2003 - 13:59 #5
Jeg fandt løsningen (rettere var der en anden, som fandt den):

$query = mysql_query("SELECT t.id AS tid, dato, overskr, tekst, tekst_id, http
FROM tekst t LEFT JOIN homepages h ON t.id=h.tekst_id
WHERE t.id='$id' ");

Og så var det egentlige problem:
            ECHO "\n";
        }
        $r = mysql_fetch_array($query);
    }
$r = mysql_fetch_array($query);
}

>>erikjacobsen
Selvfølgelig kunne jeg lave to SELECT's, men da det er en performance-mæssigt dårlig løsning, og jeg samtidigt havde ide om at det kunne gøres med een SELECT, så ville jeg undgå det.
Avatar billede erikjacobsen Ekspert
24. april 2003 - 15:42 #6
Øh, om du laver et alias "h" for "homepages" eller ej, burde
ikke betyde noget. Så min burde vel også virke.

Problemet med denne ene SELECT med en JOIN er vel at du så henter en
masse redundant information - nemlig alle felterne i "tekst" - hvis altså
der er mere end én "homepage" tilknyttet.
Avatar billede 1409 Praktikant
24. april 2003 - 19:55 #7
Nej, alias'et betyder ikke noget. Det afgørende var, at WHILE-løkken kørte uendeligt.
Du har ret i - så vidt jeg kan gennemskue - at løsningen giver en vis redundans, men der er vist ikke andre muligheder. Eller er der?
Avatar billede erikjacobsen Ekspert
24. april 2003 - 20:28 #8
Ikke ud over 2 selecter - og hvad der præcis er billigst i dit
tilfælde er svært at sige. Men er der Maaaaaaaannnnnggggeeee, så
skal du nok undgå redundans.
Avatar billede 1409 Praktikant
24. april 2003 - 20:54 #9
Jeg ved heller ikke med sikkerhed, hvad der er mest hensigtsmæssigt i denne forbindelse, for det drejer sig måske om op til 3-5 stykker.
På den anden side set, så vil problemet sikkert dukke op igen senere.... :-)
Avatar billede 1409 Praktikant
24. april 2003 - 23:54 #10
En bedre løsning for at undgå redundans:

$query = mysql_query("SELECT DISTINCT dato, overskr, tekst, tekst_id, http
FROM tekst t LEFT JOIN homepages h ON t.id=h.tekst_id
WHERE t.id='$id' ");

Testet og testet..... :-)
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