Gå til innhold

PHP & mySQL: Spørring til to tabeller


Anbefalte innlegg

Skrevet

Jeg har satt opp en mySQL database, men jeg klarer ikke hente ut data fra begge tabellene sammtidig. Det går ikke med "SELECT * FROM tabell1, tabell2 WHERE id = '$id'"

Er det noen som har peil på hva jeg kan gjøre, eller hva som er feil?

Videoannonse
Annonse
Skrevet

Skjønner ikke helt hva du skal gjøre? Skal du hente ut rader fra tabell1 og tabell2 som har samme id? I så fall:

$sql = "SELECT * FROM tabell1 INNER JOIN tabell2 ON tabell1.id=tabell2.id"; 
eller
$sql = "SELECT * FROM tabell1, tabell2 WHERE tabell1.id=tabell2.id";

 

Edit:

Eller skal du søke etter noe både i tabell1 og tabell2?

Skrevet
Skjønner ikke helt hva du skal gjøre? Skal du hente ut rader fra tabell1 og tabell2 som har samme id? I så fall:

$sql = "SELECT * FROM tabell1 INNER JOIN tabell2 ON tabell1.id=tabell2.id"; 
eller
$sql = "SELECT * FROM tabell1, tabell2 WHERE tabell1.id=tabell2.id";

 

Edit:

Eller skal du søke etter noe både i tabell1 og tabell2?

Jeg har to tabeller, tabell1 og tabell2. Jeg har en php-fil som skal hente ut en url fra id'en som står bak ?id=id'en. Tabell1 og tabell2 inneholder de to radene url og id. Ingen av id'ene i de to tabellene er like. Skjønner bedre nå?

Skrevet
Gå inn i mysql og skriv "desc Tabell1" og "desc Tabell2" og skriv utputten her, så skjønner jeg kanskje bedre hvordan det er bygget opp

Tabell1:

 

id int(3) PRI 0

mobil varchar(15)

kategori varchar(20)

url varchar(100)

name varchar(50)

size varchar(4)

evaluation int(1) 0

description blob

artist varchar(100)

mmskategori varchar(50)

 

 

Tabell2:

 

id int(3) 0

mobil varchar(15)

kategori varchar(20)

url varchar(100)

 

 

Sånn................

Skrevet

Prøv dette:

(select url
from tabell1
where id = '$id')
union
(select url
from tabell2
where id = '$id')

 

Edit: Hvis id kan finnes flere ganger i tabellen, så må du bruke union all, ellers virker den som distinct.

Skrevet
Prøv dette:

(select url
from tabell1
where id = '$id')
union
(select url
from tabell2
where id = '$id')

 

Edit: Hvis id kan finnes flere ganger i tabellen, så må du bruke union all, ellers virker den som distinct.

Slik?:

 

$query = mysql_query("SELECT url FROM tabell1 WHERE id = $id") union ("SELECT url FROM tabell2 WHERE id = $id"); // Henter all informasjon fra databasen til $query

Skrevet

Kjenner ikke PHP, men vil anta noe mer som:

$query = mysql_query("(SELECT url FROM tabell1 WHERE id = $id) union (SELECT url FROM tabell2 WHERE id = $id)"); // Henter all informasjon fra databasen til $query

 

Den henter ikke all informasjon, men url'ene. Union forutsetter at datatypene du henter er identiske.

 

Glemte også å si at union fungerer fra mySQL v. 4.0. Hvis du bruker eldre versjoner, så blir det litt mer knotete å oppnå det samme.

Skrevet
Kjenner ikke PHP, men vil anta noe mer som:
$query = mysql_query("(SELECT url FROM tabell1 WHERE id = $id) union (SELECT url FROM tabell2 WHERE id = $id)"); // Henter all informasjon fra databasen til $query

 

Den henter ikke all informasjon, men url'ene. Union forutsetter at datatypene du henter er identiske.

 

Glemte også å si at union fungerer fra mySQL v. 4.0. Hvis du bruker eldre versjoner, så blir det litt mer knotete å oppnå det samme.

Da får jeg opp denne feilmeldingen:

 

Warning: mysql_result(): supplied argument is not a valid MySQL result resource in /home/httpd/vhosts/httpdocs/test.php on line 16

Skrevet
litt keitete men:

SELECT DISTINCT $id,IF(Tabell1.id=$id,Tabell1.url,Tabell2.url) as url
FROM Tabell1, Tabell2
WHERE Tabell1.id=$id OR Tabell2.id=$id

TUSEN TAKK :D

 

Men hvis du kunne hjelpe meg med en ting til... Hva blir det hvis jeg skal ha Tabell1, Tabell2, Tabell3 og Tabell4?

 

TUSEN TAKK NOK EN GANG :D

Skrevet

SELECT DISTINCT $id AS id, IF(Tabell1.id=$id,Tabell1.url,IF(Tabell2.id=$id,Tabell2.url,IF(Tabell3.id=$id,Tabell3.url,Tabell4.url))) as url
FROM Tabell1, Tabell2, Tabell3, Tabell4
WHERE Tabell1.id=$id OR Tabell2.id=$id OR Tabell3.id=$id OR Tabell4.id=$id

 

Edit: Glemte "Tabell3,Tabell4" i FROM

Edit2: Tok med aliaset "AS id" i SELECT'en dersom det er ønskelig at feltet skal ha et navn, men du vet jo id'en før du spør så det er jo ikke nødvendig.

 

Edit3:

Alternativt:

$myrow = "";
$antall_tabeller = 4;
for ($j = 1; $j <= $antall_tabeller; $j++) {
  $sql = "SELECT * FROM Tabell".$j" WHERE id=".$id;
  $result = mysql_query($sql);
  if ($myrow = mysql_fetch_array($result)) {
     break;
  }
}
if (!$myrow) {
  echo "Fant ingen resultater med id=".$id;
} else {
  echo "Fant url ".$myrow["url"];
}

 

edit4: phpkoden over vil bare skrive ut et resultat. Hvis det er flere må det gjøres noe istedenfor break i for-løkka.

Skrevet
SELECT DISTINCT $id AS id, IF(Tabell1.id=$id,Tabell1.url,IF(Tabell2.id=$id,Tabell2.url,IF(Tabell3.id=$id,Tabell3.url,Tabell4.url))) as url
FROM Tabell1, Tabell2, Tabell3, Tabell4
WHERE Tabell1.id=$id OR Tabell2.id=$id OR Tabell3.id=$id OR Tabell4.id=$id

 

Edit: Glemte "Tabell3,Tabell4" i FROM

Edit2: Tok med aliaset "AS id" i SELECT'en dersom det er ønskelig at feltet skal ha et navn, men du vet jo id'en før du spør så det er jo ikke nødvendig.

 

Edit3:

Alternativt:

$myrow = "";
$antall_tabeller = 4;
for ($j = 1; $j <= $antall_tabeller; $j++) {
  $sql = "SELECT * FROM Tabell".$j" WHERE id=".$id;
  $result = mysql_query($sql);
  if ($myrow = mysql_fetch_array($result)) {
     break;
  }
}
if (!$myrow) {
  echo "Fant ingen resultater med id=".$id;
} else {
  echo "Fant url ".$myrow["url"];
}

 

edit4: phpkoden over vil bare skrive ut et resultat. Hvis det er flere må det gjøres noe istedenfor break i for-løkka.

Dette har jeg brukt over 10 timer på å klare, så TUSEN TAKK :D

Skrevet
SELECT DISTINCT $id AS id, IF(Tabell1.id=$id,Tabell1.url,IF(Tabell2.id=$id,Tabell2.url,IF(Tabell3.id=$id,Tabell3.url,Tabell4.url))) as url
FROM Tabell1, Tabell2, Tabell3, Tabell4
WHERE Tabell1.id=$id OR Tabell2.id=$id OR Tabell3.id=$id OR Tabell4.id=$id

Denne spørringen fungerer, men bruker fryktelig lang tid før den klarer å hente url'en... Noen tips?

Skrevet

Den alternative måten jeg tenkte på i går, var å lage en temporær tabell som du kopierer alle relevante data til, for så å gjøre select'en:

CREATE TEMPORARY TABLE temp_url TYPE=HEAP (id int(3), url varchar(100));
INSERT INTO temp_url (id, url) SELECT id, url FROM table1;
INSERT INTO temp_url (id, url) SELECT id, url FROM table2;
INSERT INTO temp_url (id, url) SELECT id, url FROM table3;
INSERT INTO temp_url (id, url) SELECT id, url FROM table4;
SELECT * FROM temp_url WHERE id = '$id';
DROP TABLE temp_url;

 

Siden HEAP arbeider i memory, så burde den gå relativt raskt.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...