Sida 1 av 1

Hjälp med SQL Join eller vad det nu kan bli

Postat: 07 maj 2009, 17:15
av Emil.s
Håller på med ett litet frågesports-spel som databas projekt, och jag har 2 databaser. 1 med frågorna, och 1 med kategorierna.

Kategoritabellen ser ut som följande:
ID (INTEGER - auto increment)
kategorinamn (VARCHAR)
beskrivning (VARCHAR)

Och frågetabellen ser ut så här:
ID (INTEGER - auto increment)
Frågan: (fraga/VARCHAR)
Rätt svar: (svar/VARCHAR)
Svårighetsgrad: (niva/VARCHAR)
Kategori: (kategori/VARCHAR)

I exemplet så har vi kategorin "GNU/Linux" (kategorinamn) med ID=1.

Koden för att lägga till frågor ser ut så här:

Kod: Markera allt

    <form name="katbox" method="post" action="">
   <table>
    <tr><td>Fråga:</td><td><textarea name="fraga" rows="5" cols="50"></textarea></td></tr>  
    <tr><td>Kategori:</td><td>
    <select name="kategori">
    <option>Välj här</option>
    <?php
    // Här ska kategorinamnen tas från katogorier/kategorinamn. Sen ska frågan läggas in med kategoriers ID som kategori i fragor.
    $select = "select * from kategorier";
    $query = mysql_query($select);
    if(mysql_num_rows($query)) {
      while($row = mysql_fetch_assoc($query) ) { 
	echo "<option>$row[kategorinamn]</option>";  
	} }
  ?>
    <input type="button" value="Lägg till ny Kategori" onklick="window.location.href='hanterakat.php'">
    </select>
    </td></tr>
    <tr><td>Svårighetsgrad:</td><td><select name="niva"><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></td></tr>
    <tr><td>Svar:</td><td><textarea name="svar" rows="5" cols="50"></textarea></td></tr>
    <tr><td> </td><td><input type="submit" value="Lägg till fråga" /></td></tr>
   </table>
  </form>
Senare läggs datan in genom att anropa:

Kod: Markera allt

$result = mysql_query( "insert into fragor ( fraga, kategori, svar, niva ) values ('" . $fraga . "', '" . $kategori . "', '" . $svar . "', '" . $niva . "')", $db );
		if( $result == false ) {
			die( "No results from DB : " . mysql_error( $db )	 );
		}
Och efter det så visas en lista med alla frågor med följande:

Kod: Markera allt

while.... print "<tr><td>Fråga: </td><td>" . $row["fraga"] . "</td><tr><td>Kategori: </td><td>" . $row[ "kategori" ] *mer kod...*
Problemet nu är ju att det kommer att stå "GNU/Linux" som en VARCHAR i tabellen med frågor. Jag vill att när man vart "GNU/Linux" i drop-boxen, så ska IDt från kategoritabellen (1), skickas in som kategori i frågetabellen, och när allt visas sen så ska koden hämta frågorna, och automatiskt ersätta ID-nummret med "kategorinamn" på något sätt.

Hur löser man detta på ett vettigt sätt? :P

Re: Hjälp med SQL Join eller vad det nu kan bli

Postat: 07 maj 2009, 21:06
av KiviE
Emil.s skrev: Kategoritabellen ser ut som följande:
ID (INTEGER - auto increment)
kategorinamn (VARCHAR)
beskrivning (VARCHAR)

Och frågetabellen ser ut så här:
ID (INTEGER - auto increment)
Frågan: (fraga/VARCHAR)
Rätt svar: (svar/VARCHAR)
Svårighetsgrad: (niva/VARCHAR)
Kategori: (kategori/VARCHAR)
Vet inte om jag har fattat dig rätt men tabellerna är hopkopplade med de fälten som jag har markerat med fet stil?

Isf skulle jag föreslå att du istället kopplar ihop så här:
Kategoritabellen ser ut som följande:
ID (INTEGER - auto increment)
kategorinamn (VARCHAR)
beskrivning (VARCHAR)

Och frågetabellen ser ut så här:
ID (INTEGER - auto increment)
Frågan: (fraga/VARCHAR)
Rätt svar: (svar/VARCHAR)
Svårighetsgrad: (niva/VARCHAR)
Kategori: (kategori/INTEGER)
En innerjoin skulle då se ut något så här:
SELECT * FROM kategorier INNER JOIN fragor ON kategorier.ID = fragor.kategori

Nu heter ID samma i båda vilket medför en liten krock. Var länge sedan jag skrev sql frågor så kommer inte ihåg vilket ID den väljer men det kan du själv mappa om i sqlfrågan om det skulle behövas.

Re: Hjälp med SQL Join eller vad det nu kan bli

Postat: 02 jun 2009, 00:05
av zoombywoof
om du kopplar tabellerna som Kivie skrev så kan du få ut kategorinamnet på följande sätt:

Kod: Markera allt

select F.fraga,F.svar,F.niva,K.kategornamn from Fragor F, Kategorier K
where K.id=Fragor.kategori
Du bör också kanske överväga att sätt referens mellan kategori id'na så att du inte av misstag får en inkonsistent databas.

Kod: Markera allt

Ex.
Create table Fragor
id int auto,
fraga varchar,
svar varchar,
niva varchar,
kategori int,
FOREIGN KEY (kategori) REFERENCES Kategorier(id) ON DELETE CASCADE
/zw