Avatar billede huutt Nybegynder
29. april 2008 - 15:17 Der er 16 kommentarer og
1 løsning

Hent data fra flere tabeller

Hej eksperter hvorfor funger denne sql kald ikke ?

$sql = "SELECT * FROM tabel1, tabel2, tabel3 WHERE tabel1.id='1' OR tabel2.id='1' OR table3.id='1'";


    $query = mysql_query($sql);
  while($row = mysql_fetch_array($query)) {
    echo $row[tekst] . "<hr>";
  }

Her retuner den kun indholdet af den sidste tabel.
Avatar billede w13 Novice
29. april 2008 - 15:19 #1
Uden at vide det med sikkerhed, skal:

*

så ikke være:

*.tabel1, *.tabel2, *.tabel3

?
Avatar billede huutt Nybegynder
29. april 2008 - 15:24 #2
har prøvet med *.tabel1 ... men så melder den fejl så prøvede lige med tabel1.* istedet da det passede min logik bedre, så melder den godtnok ikke fejl men den kommer heller ikke med noget resultat til min while loop
Avatar billede pidgeot Nybegynder
29. april 2008 - 15:29 #3
Mon ikke det du i virkeligheden er ude efter er dette:

SELECT * FROM tabel1 WHERE id = 1
UNION
SELECT * FROM tabel2 WHERE id = 1
UNION
SELECT * FROM tabel3 WHERE id = 1

(evt. UNION ALL i stedet for UNION)
Avatar billede arne_v Ekspert
29. april 2008 - 15:44 #4
Det lyder rigtigt.

Den originale SQL boer returnere ret mange raekker.
Avatar billede huutt Nybegynder
29. april 2008 - 16:22 #5
det lader det ikke til at den gør for der bliver kun skrevet teksten en gang
selvom jeg har lagt den ind i flere tabeller
Avatar billede pidgeot Nybegynder
29. april 2008 - 17:12 #6
Som sagt, brug evt. UNION ALL i stedet for UNION - så kommer dubletter med...

...men det lugter lidt af dårlig databasestruktur, det du har gang i...
Avatar billede huutt Nybegynder
29. april 2008 - 17:37 #7
jeg tvivler på det er dårlig struktur ;)
Avatar billede pidgeot Nybegynder
29. april 2008 - 17:42 #8
Blot fordi det ikke ER dårlig struktur, så kan det godt lugte af det - jeg bliver blot lidt mistænksom når jeg ser tre forskellige tabeller der bruges til hvad der tilsyneladende er samme formål. Du kan selvfølgelig godt have en god grund, og så er den jo ikke længer end det *-)

Hvis det stadig ikke er nok med UNION ALL, må du nok enten tage et kig på hvad den query SÅ returnerer, eller også må du fortælle os lidt mere om de tabeller.
Avatar billede huutt Nybegynder
29. april 2008 - 18:09 #9
CREATE TABLE `tabel1` (
  `id` int(11) NOT NULL auto_increment,
  `testid` int(1) NOT NULL default '0',
  `tekst` varchar(50) NOT NULL default 'tabel1',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


CREATE TABLE `tabel2` (
  `id` int(11) NOT NULL auto_increment,
  `testid` int(1) NOT NULL default '0',
  `tekst` varchar(50) NOT NULL default 'tabel2',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


INSERT INTO `tabel2` VALUES (1, 1, 'tabel2 - test1');
INSERT INTO `tabel2` VALUES (2, 2, 'tabel2 -test2');

CREATE TABLE `tabel3` (
  `id` int(11) NOT NULL auto_increment,
  `testid` int(1) NOT NULL default '0',
  `tekst` varchar(50) NOT NULL default 'tabel3',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `tabel3` VALUES (1, 1, 'tabel3 - test1');
INSERT INTO `tabel3` VALUES (2, 2, 'tabel3 - test1');


<?
$connect  = mysql_connect("localhost", "", "") or die("Kunne ikke forbinde : " . mysql_error());
  mysql_select_db("test") or die("kunne ikke vælge databasen");

  $sql = "SELECT * FROM tabel1, tabel2, tabel3 WHERE tabel1.testid='1' OR tabel2.testid='1' OR tabel3.testid='1'";

  $query = mysql_query($sql);
 
  if (!$query) {die('Invalid query: ' . mysql_error());}

  while($row = mysql_fetch_array($query)) {
    echo $row[tekst] . "<br>";
  }

?>
Avatar billede huutt Nybegynder
29. april 2008 - 18:10 #10
der var lige et lille eksempel på min kode, men hvordan ville du skrive den der UNION ind i den kode der ?

Jeg er måske lidt dum, men sådan er det nu en gang lige idag ;)
Avatar billede pidgeot Nybegynder
29. april 2008 - 18:13 #11
Du sætter den ganske enkelt ind i stedet for den SELECT du har forsøgt dig med...

$sql = "SELECT * FROM tabel1 WHERE testid = 1 UNION SELECT * FROM tabel2 WHERE testid = 1 UNION SELECT * FROM tabel3 WHERE testid = 1";

Hvis dubletter skal med (så der altså kan være to ens rækker) skriver du UNION ALL i stedet for UNION.
Avatar billede huutt Nybegynder
29. april 2008 - 18:14 #12
lol, det kan jo ikke være nemmere fik til det at virke enda ved at copy paste dit indlæg og så lige tilrette det..

man hvad gør UNION enligt og hvad gør den i forhold til UNION ALL ?

men smid et svar
Avatar billede huutt Nybegynder
29. april 2008 - 18:21 #13
men hvis de to tabeller ikke har ligemange kolonner så kan man vel ikke bruge UNION ?
Avatar billede pidgeot Nybegynder
29. april 2008 - 18:32 #14
UNION konkatenerer resultatet fra to forespørgsler - dvs. at den sætter dem efter hinanden (den på venstre side kommer først). Dertil filtrerer den identiske rækker fra - hvis denne del vil undgås, bruges UNION ALL.

Mht. flere kolonner i en af tabellerne, så vil det ikke fungere - i hvert fald ikke efter hensigten - men så har du nok heller ikke brug for alle kolonnerne, og nøjes derfor med at vælge de kolonner der skal bruges. Du kan, hvis det absolut er nødvendigt, overveje at bruge NULL til en kolonne, men der er en god chance for at du er ude i noget rod hvis du har brug for det.

Den sætter dem sammen ud fra den numeriske position i resultatsættet, og derfor vil det stadig virke selvom du har forskellige kolonnenavne - det resultatsæt du får ud vil benytte navnene fra den første SELECT hele vejen igennem.
Avatar billede huutt Nybegynder
29. april 2008 - 18:38 #15
ok, takker for tiden. og smid så lige et svar ;)
Avatar billede pidgeot Nybegynder
29. april 2008 - 18:42 #16
Værsgo.
Avatar billede huutt Nybegynder
29. april 2008 - 18:48 #17
Takker.
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



IT-JOB