Oprettet man. d. 27. september 2004 kl. 18:14:02

supermand69
supermand69 (10.703 point. Point ude: 85)

hente fra alle tables som starter med "debate_"

hvordan kan jeg joine alle tables i MySQL der starter med "debate_"

jeg vil f.eks. hente alle rækker hvor feltet user_id har en bestemt værdi

Skrevet man. d. 27. september 2004 kl. 19:05:33| #1

shjorth
shjorth (4.230 point)
mysql_query("SELECT * FROM tabel WHERE user_id='din ting'")or die(mysql_error()); ???

Skrevet man. d. 27. september 2004 kl. 19:10:10| #2

supermand69
supermand69 (10.703 point)
ja, men jeg skal først lige hente alle tables der starter med "debate_"

eks.
debate_musik
debate_generelt

Skrevet man. d. 27. september 2004 kl. 19:15:12| #3

hmortensen
hmortensen (62.884 point)
Kan man ikke hente output fra 'show tables' og så søge i arrayet efter 'debate_', og konstruere sin sql sætning ud fra det

Skrevet man. d. 27. september 2004 kl. 19:21:13| #4

supermand69
supermand69 (10.703 point)
hvordan virker show tables da? :)

Skrevet man. d. 27. september 2004 kl. 19:23:18| #5

milo
milo (24.309 point)
Det er kun tilladt at oprette et spørgsmål én gang, den regel accepterede du da du oprettede en bruger på eksperten.

Skrevet man. d. 27. september 2004 kl. 19:28:17| #6

supermand69
supermand69 (10.703 point)
milo > nu er det sådan jeg fik besked på at det ikke kunne lade sig gøre at lave det i MySQL så jeg oprettede det derfor i PHP i stedet for... det andet spm er også lukket

Skrevet man. d. 27. september 2004 kl. 19:31:04| #7

arne_v
arne_v (1.005.658 point)
Her er en stump kode som viser hvordan man finder alle tabeller:

<?php
$con = mysql_connect("localhost", "root", "") or die(mysql_error());
$rs = mysql_query("SHOW TABLES") or die(mysql_error());
while ($row = mysql_fetch_array($rs)) {
    // her indeholder $row["0"] tabelnavn
}
mysql_free_result($rs);
mysql_close($con);
?>

Skrevet man. d. 27. september 2004 kl. 20:13:15| #8

hmortensen
hmortensen (62.884 point)
arne, man kan også sætte en LIKE parameter på SHOW TABLES:

SHOW TABLES LIKE 'debate_%'

Skrevet man. d. 27. september 2004 kl. 20:16:20| #9


Skrevet man. d. 27. september 2004 kl. 21:23:56| #10

supermand69
supermand69 (10.703 point)
tak for hjælpen...

lav et svar begge to :)

$get = mysql_query("SHOW TABLES FROM $DB LIKE 'debate_%'");
while($row = mysql_fetch_array($get))
{
    $get2 = mysql_query("SELECT COUNT(id) FROM $DB.$row[0] WHERE user_id=$_GET[user]");
    $row2 = mysql_fetch_array($get2);
    $contributions += $row2[0];
}

Skrevet man. d. 27. september 2004 kl. 21:26:36| #11


Skrevet man. d. 27. september 2004 kl. 21:40:39| #12

hmortensen
hmortensen (62.884 point)
Det var så lidt

Skrevet man. d. 27. september 2004 kl. 22:30:26| #13

jakoba
jakoba (172.332 point)
Det lyder lidt somom din database er skidt organiseret. Istedet for en masse forskellige 'debat_<emne>' tabeller kunne du lave een enkelt tabel med navnet debat, og så et ekstra felt i rækkerne i den tabel for emnet.

Skrevet man. d. 27. september 2004 kl. 22:35:38| #14

arne_v
arne_v (1.005.658 point)
Jeg synes mere det lyder som web hotel med kun en database og helt forskellige applikationer ...

Skrevet tir. d. 28. september 2004 kl. 16:11:22| #15

supermand69
supermand69 (10.703 point)
jakoba > jeg har overvejet at lave det i en table, men bliver søgetiden ikke rimelig lang når der kommer rigtig mange rækker?? når nu min debat forum er delt ud over flere filer skulle man jo tro at det gik hurtigere?? eller det er måske bare noget jeg tror?? :)

Skrevet tir. d. 28. september 2004 kl. 16:26:04| #16

arne_v
arne_v (1.005.658 point)
Hvis data naturligt passer ind i en tabel så er det formentlig hurtigst
at have dem i en tabel fremfor mange små tabeller.

Skrevet tir. d. 28. september 2004 kl. 16:33:57| #17

supermand69
supermand69 (10.703 point)
hvad mener du?

hver table bliver jo søgt i seperat, altså der er en side for hver table (tema)

Skrevet tir. d. 28. september 2004 kl. 16:35:18| #18

supermand69
supermand69 (10.703 point)
her er min struktur:

CREATE TABLE `debate_feedback` (
  `id` mediumint(7) NOT NULL auto_increment,
  `thread_id` mediumint(7) NOT NULL default '0',
  `reply_id` mediumint(7) NOT NULL default '0',
  `user_id` smallint(5) NOT NULL default '0',
  `time` int(10) NOT NULL default '0',
  `subject` varchar(40) NOT NULL default '',
  `msg` text NOT NULL,
  PRIMARY KEY  (`id`,`reply_id`,`user_id`),
  KEY `thread_id` (`thread_id`),
  KEY `time` (`time`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

Skrevet tir. d. 28. september 2004 kl. 16:37:47| #19

supermand69
supermand69 (10.703 point)
og her er min kode for lige at få et indblik i hvordan den fungerer :)

<?
require('req/functions.php');

$table = 'debate_'.$_GET['topic'];

$limit2 = 10;
?>
<html>

<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>

<body onload="parent.write_to_div('div_debate_overview', document.getElementById('overview').innerHTML); parent.write_to_div('div_debate_threads', document.getElementById('threads').innerHTML)">

<div id="overview">
<?
$sql = "SELECT debate.id, IFNULL(MAX(debate2.time), debate.time) AS last_time
    FROM $DB.$table debate
    LEFT JOIN $DB.$table debate2 ON debate.id=debate2.thread_id && debate2.reply_id!=0
    WHERE debate.reply_id=0
    GROUP BY debate.thread_id
    ORDER BY last_time DESC";

$list_arr = view_list($sql, $_GET['limit'], $limit2);

echo page_overview($list_arr['num_page'], $list_arr['cur_page'], $limit2, 'iframe_debate_threads', 'iframe.debate_threads.php', 'parent.write_to_div(\'div_debate_threads\', initHTML[\'div_debate_threads\'])', 'topic');
?>
&nbsp;</div>

<div id="threads">
<?
function thread($reply_id, $table)
{
    global $DB, $NO_USER, $threads;
   
    $i = 1;
   
    $sql = "SELECT debate.id, debate.subject, debate.user_id, debate.time, COUNT(debate2.reply_id) AS replies, user.name
        FROM ($DB.$table debate LEFT JOIN $DB.user user ON debate.user_id=user.id)
        LEFT JOIN $DB.$table debate2 ON debate.id=debate2.reply_id
        WHERE debate.reply_id=$reply_id
        GROUP BY debate.id
        ORDER BY debate.time DESC";
    $get = mysql_query($sql);
    $num = mysql_num_rows($get);
    while($row = mysql_fetch_array($get))
    {
        if(!$row['name']) $name = $NO_USER;
        else $name = sql2txt($row['name'], 0);
?>
<table>
  <tr valign="top">
<?
    if($row['replies'])
    {
        if($num == $i) echo '<td><a href="java script:thread_expand('.$row['id'].')"><img id="img'.$row['id'].'" src="gfx/obj.debate_thread_closed.gif"></a>';
        else echo '<td style="background:url(\'gfx/obj.debate_thread_bg.gif\')"><a href="java script:thread_expand('.$row['id'].')"><img id="img'.$row['id'].'" src="gfx/obj.debate_thread_closed.gif"></a>';
       
        $threads .= ','.$row['id'];
    }
    else
    {
        if($num == $i) echo '<td><img src="gfx/obj.debate_thread_end.gif">';
        else echo '<td style="background:url(\'gfx/obj.debate_thread_bg.gif\')"><img src="gfx/obj.debate_thread.gif">';
    }
?>
    </td>
    <td>
      <table>
        <tr valign="top">
          <td id="td<?=$row['id']?>"><img src="gfx/obj.debate_thread_msg.gif"></td>
          <td style="padding-bottom:6px">
          <a href="iframe.debate_contribution.php?topic=<?=$_GET['topic']?>&thread=<?=$row['id']?>" target="iframe_debate_contribution" onclick="document.getElementById('div_debate_contribution').style.display = 'block'; write_to_div('div_debate_contribution', initHTML['div_debate_contribution'])" class="marked thread"><?=sql2txt($row['subject'], 0)?></a><br>
          <?=time2date($row['time'], 1, 1)?> - <?=$name?></td>
        </tr>
      </table>
    </td>
  </tr>
  <tr>
<?
    if($num != $i) echo '<td style="background:url(\'gfx/obj.debate_thread_bg.gif\')">';
    else echo '<td>';
?>
    </td>
    <td colspan="2">
      <div id="div<?=$row['id']?>" style="display:none">
<?
    thread($row['id'], $table);
?>
      </div>
    </td>
  </tr>
</table>
<?
        $i++;
    }
}

if($list_arr['rows'])
{
    foreach($list_arr['rows'] as $value)
    {
        $sql = "SELECT debate.subject, debate.user_id, debate.time, user.name
            FROM $DB.$table debate
            LEFT JOIN $DB.user user ON debate.user_id=user.id
            WHERE debate.id=$value";
        $get = mysql_query($sql);
        $row = mysql_fetch_array($get);
       
        if(!$row['name']) $name = $NO_USER;
        else $name = sql2txt($row['name'], 0);
       
        $get2 = mysql_query("SELECT COUNT(id) FROM $DB.$table WHERE thread_id=$value");
        $row2 = mysql_fetch_array($get2);
        $replies = $row2[0] - 1;
       
        $get3 = mysql_query("SELECT id, time FROM $DB.$table WHERE thread_id=$value ORDER BY time DESC LIMIT 1");
        $last_thread = mysql_fetch_array($get3);
?>
<table>
  <tr valign="top">
    <td style="background:url('gfx/obj.debate_thread_bg.gif');">
<?
        if($replies)
        {
            echo '<a href="java script:thread_expand('.$value.')"><img id="img'.$value.'" src="gfx/obj.debate_thread_closed.gif"></a>';
            $threads = $value;
        }
        else echo '<img src="gfx/obj.debate_thread.gif">';
?>
    </td>
    <td>
      <table>
        <tr valign="top">
          <td id="td<?=$value?>"><img src="gfx/obj.debate_thread_msg.gif"></td>
          <td style="padding-bottom:6px"><a href="iframe.debate_contribution.php?topic=<?=$_GET['topic']?>&thread=<?=$value?>" target="iframe_debate_contribution" onclick="document.getElementById('div_debate_contribution').style.display = 'block'; write_to_div('div_debate_contribution', initHTML['div_debate_contribution'])" class="marked thread"><?=sql2txt($row['subject'], 0)?></a><br>
          <?=time2date($row['time'], 1, 1)?> - <?=$name?><br>
<?
        if($replies)
        {
?>
          <a href="java script:threads(<?=$value?>, 1)">Åbn</a> | <a href="java script:threads(<?=$value?>, 0)">Luk</a> - <?=$replies?> indlæg<br>
          Seneste indlæg: <a href="iframe.debate_contribution.php?topic=<?=$_GET['topic']?>&thread=<?=$last_thread['id']?>" target="iframe_debate_contribution" onclick="document.getElementById('div_debate_contribution').style.display = 'block'; write_to_div('div_debate_contribution', initHTML['div_debate_contribution'])" class="thread"><?=time2date($last_thread['time'], 1, 1)?></a>
<?
        }
?>
          </td>
        </tr>
      </table>
    </td>
  </tr>
  <tr>
    <td style="background:url('gfx/obj.debate_thread_bg.gif')"></td>
    <td colspan="2">
      <div id="div<?=$value?>" style="display:none">
<?
        thread($value, $table);
?>
      </div>
    </td>
  </tr>
</table>
<?
        if($threads)
        {
            if(count(explode(',', $threads)) > 1) echo '<script type="text/javascript">parent.thread_arr['.$value.'] = new Array('.$threads.');</script>';
            else echo '<script type="text/javascript">parent.thread_arr['.$value.'] = new Array(); parent.thread_arr['.$value.'][parent.thread_arr['.$value.'].length] = '.$threads.';</script>';
        }
       
        unset($threads);
       
        $i++;
    }
}
else echo 'Ingen tråde...';
?>
</div>

</body>

</html>
<?
php_end(0);
?>

Skrevet tir. d. 28. september 2004 kl. 16:44:08| #20

supermand69
supermand69 (10.703 point)
Her laver jeg et array over alle tråde i det pågældende tema (table), da jeg laver en liste over alle de siderne. Har f.eks. 25 tråde på hver side. Der bliver så smidt en limit på for at vise den aktuelle side

SELECT debate.id, IFNULL(MAX(debate2.time), debate.time) AS last_time
FROM $DB.$table debate
LEFT JOIN $DB.$table debate2 ON debate.id=debate2.thread_id && debate2.reply_id!=0
WHERE debate.reply_id=0
GROUP BY debate.thread_id
ORDER BY last_time DESC

Her har jeg så en løkke der henter hver tråd ud

SELECT debate.subject, debate.user_id, debate.time, user.name
FROM $DB.$table debate
LEFT JOIN $DB.user user ON debate.user_id=user.id
WHERE debate.id=$value

Og til sidst bliver alle indlæg til hver tråd smidt ind i den pågældende tråd

"SELECT debate.id, debate.subject, debate.user_id, debate.time, COUNT(debate2.reply_id) AS replies, user.name
FROM ($DB.$table debate LEFT JOIN $DB.user user ON debate.user_id=user.id)
LEFT JOIN $DB.$table debate2 ON debate.id=debate2.reply_id
WHERE debate.reply_id=$reply_id
GROUP BY debate.id
ORDER BY debate.time DESC

Skrevet tir. d. 28. september 2004 kl. 19:12:40| #21

jakoba
jakoba (172.332 point)
Tabellens størrelse vil 'i gennemsnit' være logaritmisk proportional med tilgangstiden. dvs hvis tabellen bliver 1000 gange så stor bliver den noget i retning af log(1000) gange så langsom. jeg vil tippe at diverse php krumspring og gentagne queries ind de mange tabeller vil koste langt mere tid.

Men det er som sagt 'i gennemsnit'. Der kan være ekstreme worst-case situationer for begge opbygninger.

Almindeligvis er der langt mere tidsbesparelse i at lave gode indexer ind i sine tabeller. og at gennemtænke of teste de sql-queries man sender den.

mvh JakobA

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

php problem få en kode fra en anden side

Oprettet den 11. februar 2012 kl. 23.53
jesperkaae95 giver 30 point for svar | Giv et svar »

Udtræk af enkelte felter fra bestemte kolonner i mysql

Oprettet den 11. februar 2012 kl. 19.27
hrole giver 30 point for svar | Giv et svar »

Procentregning

Oprettet den 11. februar 2012 kl. 11.26
sevinding giver 60 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger