webForumDet fria alternativet

Skriva ihop två satser till en (join?)

Databaser & SQL

14 svar · 459 visningar · startad av Helmertz

Medlem sedan maj 2005353 inlägg
Frågan#1

Går det att skriva om dessa SQL-fråga till en? Databasen är av typen MySQL 4.0.21.

$q = mysql_query("SELECT * FROM kategorier WHERE katNamn = '$typ'");
$st = mysql_result($q,0);
$r = mysql_query("SELECT * FROM nyheter WHERE nyhetKatID = '$st'");
Medlem sedan juni 200032 967 inlägg
#2

Mit svar är: kanske.

Varför vill du göra det?
om de båda har så mycket med varandra att göra att du vill hämta dem på samma gång bör du kanske fundera på om de inte ska lagras i samma tabell.

Mvh

Medlem sedan maj 2005353 inlägg
#3

Min tanke var att i nyhetstabellen lagra ett numeriskt id som hämtar namnet på kategorin ur kategoritabellen.

Anledningar:

  1. man sparar en siffra istället för en lång fras i nyhetstabellens fält för kategori
  2. om man ska ändra namn på en kategori ändrar man det i ett fält istället för många fält

..eller? Motbevisa mig :)

Medlem sedan dec. 19996 721 inlägg
#4

Helmertz skrev:

..eller? Motbevisa mig :)

Det skulle jag gärna göra, om jag förstod vad du menade.... ;)

Vad är själva meningen med det hela? Du skickar in $katnamn som villkor till nyheter, men vad hindrar ett numeriskt $katid?

Medlem sedan maj 2005353 inlägg
#5

Meningen är att jag i tabellen nyheter ska ägna ett fält åt att visa vilken kategori nyheten är rubricerad som. Valen är att antingen skriva hela namnet på kategorin i det fältet, eller ange en siffra. Siffran kopplas sedan samman med tabellen kategorier där namnet på kategorin hämtas. På så vis sparar man plats i databasen, eftersom namnet på kategorin endast förekommer en gång. Det är även lättare att manövrera eftersom man bara behöver bry sig om tabellen kategorier när man ska döpa om namnet på kategorierna eller lägga till nya o.s.v.

En gång till: Går det att skriva om SQL-satserna i första frågan till en gemensam? :P

Medlem sedan dec. 19996 721 inlägg
#6

Okej, då är jag med

SELECT n.* FROM nyheter n,kategorier k WHERE n.nyhetKatID = k.katID AND k.katNamn='$typ'
Medlem sedan maj 2005353 inlägg
#7

Den frågan fungerade inte :( Alla poster får samma värde på katNamn.

Medlem sedan maj 2005353 inlägg
#8

Jag testade även att lägga in WHERE efter AND i frågan, då fick inga poster katNamn.

Medlem sedan dec. 19996 721 inlägg
#9

Helmertz skrev:

Den frågan fungerade inte :( Alla poster får samma värde på katNamn.

Ja, var inte det meningen? Du skickar ju in argumentet $typ, så jag antog att du bara ville ha nyheter av en speciell kategori

Medlem sedan maj 2005353 inlägg
#10

emission skrev:

Ja, var inte det meningen? Du skickar ju in argumentet $typ, så jag antog att du bara ville ha nyheter av en speciell kategori

Krångligt formulerat av mig. Jag vill bara ha en kategori, men nu får alla nyheter, oavsett typ, samma kategorinamn.

Medlem sedan juli 20011 084 inlägg
#11
SELECT k.katNamn,n.* FROM nyheter n,kategorier k WHERE k.katID = n.nyhetKatID

Hämtar ut alla nyheter med deras kategori.(om du har en vettig tabellstruktur) Förstår inte riktigt vad du vill göra. Men det borde inte vara så svårt för dig att ändra för att bara hämta en kategori eller vad du nu vill göra.

Medlem sedan maj 2005353 inlägg
#12

Okej, nu har jag en massa problem. Har stirrat mig blind på koden men gör den bara värre när jag försöker mig på att ändra den :(

Alla funktioner på min testsida ska fungera, men listningen av kategorierna fungerar mindre bra. Likaså länkarna i själva nyhetsposterna som leder till resp. kategori.

Här kommer lite kod:

# /log/index.php

<?php
include 'http://helmertz.com/includes/header.php';

// OM ID FINNS MEN INGEN TYP
if(isset($_GET['id']) && empty($GET_['typ'])){
  
  $id = addslashes($_GET['id']);

  $r = mysql_query("SELECT n.*,k.katNamn FROM nyheter n, kategorier k WHERE n.nyhet_id = '$id' LIMIT 1");
  if(empty($r)){
    echo '<p><em>Ingen nyhet finns med angivet ID.</em></p>';
  }
  
  else{

      $z = mysql_fetch_array($r);
      echo '<div id="nyhet">'."\n";
      echo '<p class="info">#'.$z['nyhet_id'].' @ '.$z['nyhet_datum'].' <a title="Bläddra bland alla nyheter av denna typ" href="http://helmertz.com/log/'.$z['katNamn'].'">'.$z['katNamn'].'</a></p>
    <p class="info"><a href="#kommentarer">Läs kommentarer</a> - <a href="#kommentera">Skriv en egen kommentar</a></p>'."\n";
      echo '<h1>'.$z['nyhet_titel'].'</h1>';
      echo $z['nyhet_text'];
      echo '</div>'."\n";
      echo '<div id="kommentarer">
<h3>Kommentarer</h3>'."\n";
      $komm = mysql_query("SELECT * FROM kommentarer WHERE k_nyhetid = $id ORDER BY k_id ASC");
      if (mysql_num_rows($komm) == 0){
         echo '<p>Inga kommentarer finns ännu till denna notis. Skriv den första!</p>'."\n";
         
  }
  else{

        echo "<ol>\n";
        while ($k = mysql_fetch_array($komm)){

          if ($k['ip'] == "x"){

            echo '<li class="callekommentar" id="'.$k['k_id'].'">
'.$k['k_innehall'].'
<p class="info">skrev <a title="Skicka e-post till Calle" href="mailto:helmertz@gmail.com">Calle</a> '.$k['k_datum'].'</p></li>'."\n";
          }
          
          else{

            if (strlen($k['k_avsmail']) > 4){

                echo '<li class="kommentar" id="'.$k['k_id'].'">
'.$k['k_innehall'].'
<p class="info">skrev <a title="Skicka e-post till '.$k['k_avs'].'" href="mailto:'.$k['k_avsmail'].'">'.$k['k_avs'].'</a> '.$k['k_datum'].'</p></li>'."\n\n";
            }

            else{

                echo '<li class="kommentar" id="'.$k['k_id'].'">
'.$k['k_innehall'].'
<p class="info">skrev '.$k['k_avs'].' '.$k['k_datum'].'</p></li>'."\n\n";

            }
            }
        }
  }
    echo '</ol>
</div>

<div id="kommentera">
<form method="post" action="/log/kommentar.php">
<input type="hidden" value="'.$z['nyhet_id'].'" name="nyhetid" id="nyhetid" />
<input type="hidden" value="2122" name="21221" />
<p><label for="avs">Namn</label>
<input type="text" name="avs" id="avs" /></p>
<p><label for="avsmail">E-postadress</label>
<input type="text" name="avsmail" id="avsmail" /></p>
<p><label for="innehall">Meddelande</label>
<textarea cols="13" rows="10" name="innehall" id="innehall"></textarea></p>
<p><input type="submit" value="Kommentera" name="submit" id="submit" /></p>
</form>
</div>'."\n";

}
}
// OM TYP FINNS MEN INGET ID
elseif(empty($_GET['id']) && isset($_GET['typ'])){

      $typ = strtolower(addslashes(trim($_GET['typ'])));

      $q = mysql_query("SELECT * FROM kategorier WHERE katNamn = '$typ'");
      $st = mysql_result($q,0);
      $r = mysql_query("SELECT * FROM nyheter WHERE nyhetKatID = '$st'");
      if(empty($r)){
        echo '<p><em>Ingen nyhet finns med angiven typ.</em></p>';
      }

  else{

        echo '<p><strong>' . mysql_num_rows($r) . '</strong> nyheter av typen <strong>' . $typ . '</strong> hittades.</p>';

        while($z = mysql_fetch_array($r)){

          echo '<div class="nyhet">'."\n";
          echo '<h2>'.$z['nyhet_titel'].' <span class="date">| '.$z['nyhet_datum'].'</span></h2>'."\n";
          echo '<p>'.$z['nyhet_beskrivning'].'</p>'."\n";
          echo '<p>• <a href="/log/'.$z['nyhet_id'].'">Läs hela inlägget</a></p>'."\n";
          echo '</div>'."\n";

    }
    
    echo '<p><a href="/log/">Tillbaka till loggen</a></p>';
  }
}
// OM VARKEN TYP ELLER ID FINNS
else{

  $r = mysql_query("SELECT * FROM nyheter ORDER BY nyhet_id DESC LIMIT 7");
  
  while($z = mysql_fetch_array($r)){

          echo '<div class="nyhet">'."\n";
          echo '<p class="info">#'.$z['nyhet_id'].' @ '.$z['nyhet_datum'].' <a title="Bläddra bland alla nyheter av denna typ" href="http://helmertz.com/log/'.$z['nyhet_typ'].'">'.$z['nyhet_typ'].'</a></p>'."\n";
          echo '<h2>' . $z['nyhet_titel'] . '</h2>'."\n";
          echo '<p>'.$z['nyhet_beskrivning'].'</p>'."\n";
          echo '<p>• <a href="/log/'.$z['nyhet_id'].'" class="laeshela">Läs hela inlägget</a></p>'."\n";
          echo '</div>'."\n";
    }

}

include 'http://helmertz.com/includes/footer.php';
?>
# /includes/functions.php

<?php

function firstNews(){
  $sql = mysql_query("SELECT * FROM nyheter ORDER BY nyhet_id DESC LIMIT 1");
  print '<div id="firstNews">'."\n";
  while($z = mysql_fetch_assoc($sql)){
    echo '<h1>' . $z['nyhet_titel'] . ' <span class="date">| '.$z['nyhet_datum'].'</span></h1>'."\n";
    echo $z['nyhet_text']."\n";
    echo '<p>• <a href="/log/'.$z['nyhet_id'].'"> Läs hela inlägget / kommentera</a></p>'."\n";
  }
  print "</div>\n";
}

function secNews(){
  $sql1 = mysql_query("SELECT MAX(nyhet_id) FROM nyheter");
  $sql2 = mysql_result($sql1,0) - 1;
  $sql = mysql_query("SELECT * FROM nyheter WHERE nyhet_id = '$sql2' LIMIT 1");
  print '<div id="secNews">'."\n";
  while($z = mysql_fetch_assoc($sql)){
    echo '<h2>' . $z['nyhet_titel'] . '</h2>'."\n";
    echo '<p class="date">'.$z['nyhet_datum'].'</p>';
    echo $z['nyhet_beskrivning']."\n";
    echo '<p>• <a href="/log/'.$z['nyhet_id'].'"> Läs hela inlägget / kommentera</a></p>'."\n";
  }
  print "</div>\n";
}

function thirdNews(){
  $sql1 = mysql_query("SELECT MAX(nyhet_id) FROM nyheter");
  $sql2 = mysql_result($sql1,0) - 2;
  $sql = mysql_query("SELECT * FROM nyheter WHERE nyhet_id = '$sql2' LIMIT 1");
  print '<div id="thirdNews">'."\n";
  while($z = mysql_fetch_assoc($sql)){
    echo '<h2>' . $z['nyhet_titel'] . '</h2>'."\n";
    echo '<p class="date">'.$z['nyhet_datum'].'</p>'."\n";
    echo $z['nyhet_beskrivning']."\n";
    echo '<p>• <a href="/log/'.$z['nyhet_id'].'"> Läs hela inlägget / kommentera</a></p>'."\n";
  }
  print "</div>\n";
}

function quote(){
  $sql = mysql_query("SELECT quote FROM quotes ORDER BY RAND() LIMIT 1");
  $quote = mysql_result($sql,0);
  print '<div id="quote">'."\n";
  print '<p>"'.$quote.'"</p>'."\n";
  print "</div>\n";
}

function totalPosts(){
  $sql = mysql_query("SELECT MAX(nyhet_id) FROM nyheter");
  $totalPosts = mysql_result($sql,0);
  print $totalPosts;
}

function listCats(){
  $sql = mysql_query("SELECT katNamn, COUNT(*) AS antal FROM kategorier GROUP BY katNamn");
  while ($row = mysql_fetch_assoc($sql)){
    print '<li><a href="/log/'.$row['katNamn'].'">'.ucwords(strtolower($row['katNamn'])).'</a> ('.$row['antal'].')</li>'."\n";
  }
}

function latestNews(){
  // kommer snart
}

?>

Alla anslutningar har jag tagit bort men de finns med i mina versioner.

Ser ni några uppenbara säkerhetshål så är jag tacksam om ni säger till om de också :P

De där select max(x)-1 och -2 är nödlösningar som jag använder mig av för att jag inte kan så mycket php än.

(och oroa er inte för uppbyggnaden av sidan, den ska vara som den är på testsidan, men jag ändrar inte i filerna som ska inkluderas förr än jag är klar med PHP-biten)

Medlem sedan maj 2005353 inlägg
#13
# test3.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="sv" lang="sv">
<head>
<?php include 'includes/functions.php'; ?>
<title>helmertz . com</title>

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="content-language" content="sv"/>
<meta http-equiv="imagetoolbar" content="no" />
<meta name="author" content="Carl Helmertz" />
<meta name="copyright" content="Carl Helmertz 2005" />
<meta name="keywords" content="helmertz, Helmertz, Carl Helmertz, Calle Helmertz" />
<meta name="description" content="Privat hemsida som fungerar som lekplats för script &amp; dagbok" />

<style type="text/css" media="screen,projection">
    /* IEmac \*/
	    @import url([url]http://helmertz.com/includes/css/standard.css);[/url]
    /* end hack */
</style>

<link rel="icon" type="image/x-icon" href="http://helmertz.com/includes/favicon.ico" />
<link rel="stylesheet" type="text/css" media="print" href="http://helmertz.com/includes/css/print.css" />

</head>

<body id="helmertz-com">

<div id="container"> <!-- början på #container -->

<div id="nav">
<ul>
<li><a href="/log/" title="Calles blog">Log</a></li>
<li><a href="/sidkarta/" accesskey="3">Sidkarta</a></li>
<li><a href="/om/" accesskey="0">Om helmertz.com</a></li>
<li><a href="/kontakta/" accesskey="7">Kontakta mig</a></li>
<li><form method="get" action="/sok/">
<p><input type="text" maxlength="25" value="Sökord här" onfocus="if (this.value == 'Sökord här') this.value = '';"  onblur="if (this.value == '') this.value = 'Sökord här';" name="s" id="s" accesskey="4" /></p>
<p><input type="submit" value="Sök" id="su" /></p>
</form></li>
</ul>
</div>

<div id="mainCol"> <!-- början på #mainCol -->

<?php firstNews(); ?>

<?php quote(); ?>

<?php secNews(); ?>

<?php thirdNews(); ?>

<div id="meta">
<h3>Index över bloggen</h3>
<p>Det finns totalt <?php totalPosts(); ?> inlägg och de är uppdelade inom följande kategorier:</p>
<ul>
<?php listCats(); ?>
</ul>
<p>Du kan även välja att se de senaste <?php latestNews(); ?>inläggen.</p>
</div>

</div> <!-- slut på #mainCol -->

<div id="secCol"> <!-- början på #secCol -->
<a href="/bilder/calle.jpg"><img src="/bilder/calleLiten.jpg" alt="" title="Calle" width="170" height="130" /></a>
<p>Du har kommit till Calle Helmertz privata hemsida där sådant jag tycker är intressant finns. Syftet med sidan är att ha en <em>presentation</em>, ett ställe att testa kunskaperna i <em>webdesign</em> men framför allt för att låta mitt projektarbete vara tillgängligt för allmänheten. <a href="/om/" title="En kort biografi">Läs mer</a></p>
<p class="alert">Projektarbetet <em>Din hälsa</em> ligger på adressen <a href="http://helmertz.com/dinhalsa/" title="http://helmertz.com/dinhalsa/">helmertz.com/dinhalsa/</a>.</p>
<p>För att det är så enkelt och snyggt lägger jag upp alla mina bilder på Flickr istället för på min egen hemsida. På adressen <a href="http://flickr.com/photos/helmertz/" title="Calles konto på Flickr.com">flickr.com/photos/helmertz/</a> finns mina kort.</p>
</div> <!-- slut på #secCol -->

<div id="footer">
<p>Avdelningar: <a href="/dinhalsa/">Din hälsa</a>, <a href="/log/">Log</a>, <a href="/sidkarta/">Sidkarta</a>, <a href="/kontakta/">Kontakta</a></p>
<p>Copyright Calle Helmertz 2005</p>
</div>

</div> <!-- slut på #container -->

</body>
</html>
Medlem sedan dec. 19996 721 inlägg
#14

Det ser bra ut. MAX-sökningarna kan du hoppa över, och t.ex. köra en

"SELECT * FROM nyheter WHERE ORDER BY nyhet_id DESC LIMIT 1,1"

för att få den andra nyheten

"SELECT MAX(nyhet_id) FROM nyheter" i totalPosts

borde bytas till

"SELECT COUNT(nyhet_id) FROM nyheter"

Medlem sedan maj 2005353 inlägg
#15

emission skrev:

Det ser bra ut. MAX-sökningarna kan du hoppa över, och t.ex. köra en

"SELECT * FROM nyheter WHERE ORDER BY nyhet_id DESC LIMIT 1,1"

för att få den andra nyheten

"SELECT MAX(nyhet_id) FROM nyheter" i totalPosts

borde bytas till

"SELECT COUNT(nyhet_id) FROM nyheter"

Tack!! :)

Problemen med kategorierna finns fortfarande kvar. Jag såg dessutom nu att alla kategorier innehåller 1 post var, enligt min lista, när de egentligen innehåller fler. Men nu har jag iaf lärt mig lite bättre SQL. Tack ;)

264 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)