Avatar billede supermand69 Nybegynder
27. september 2004 - 18:14 Der er 19 kommentarer og
2 løsninger

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
Avatar billede shjorth Nybegynder
27. september 2004 - 19:05 #1
mysql_query("SELECT * FROM tabel WHERE user_id='din ting'")or die(mysql_error()); ???
Avatar billede supermand69 Nybegynder
27. september 2004 - 19:10 #2
ja, men jeg skal først lige hente alle tables der starter med "debate_"

eks.
debate_musik
debate_generelt
Avatar billede hmortensen Nybegynder
27. september 2004 - 19:15 #3
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
Avatar billede supermand69 Nybegynder
27. september 2004 - 19:21 #4
hvordan virker show tables da? :)
Avatar billede milo Nybegynder
27. september 2004 - 19:23 #5
Det er kun tilladt at oprette et spørgsmål én gang, den regel accepterede du da du oprettede en bruger på eksperten.
Avatar billede supermand69 Nybegynder
27. september 2004 - 19:28 #6
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
Avatar billede arne_v Ekspert
27. september 2004 - 19:31 #7
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);
?>
Avatar billede hmortensen Nybegynder
27. september 2004 - 20:13 #8
arne, man kan også sætte en LIKE parameter på SHOW TABLES:

SHOW TABLES LIKE 'debate_%'
Avatar billede arne_v Ekspert
27. september 2004 - 20:16 #9
Avatar billede supermand69 Nybegynder
27. september 2004 - 21:23 #10
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];
}
Avatar billede arne_v Ekspert
27. september 2004 - 21:26 #11
svar
Avatar billede hmortensen Nybegynder
27. september 2004 - 21:40 #12
Det var så lidt
Avatar billede jakoba Nybegynder
27. september 2004 - 22:30 #13
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.
Avatar billede arne_v Ekspert
27. september 2004 - 22:35 #14
Jeg synes mere det lyder som web hotel med kun en database og helt forskellige applikationer ...
Avatar billede supermand69 Nybegynder
28. september 2004 - 16:11 #15
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?? :)
Avatar billede arne_v Ekspert
28. september 2004 - 16:26 #16
Hvis data naturligt passer ind i en tabel så er det formentlig hurtigst
at have dem i en tabel fremfor mange små tabeller.
Avatar billede supermand69 Nybegynder
28. september 2004 - 16:33 #17
hvad mener du?

hver table bliver jo søgt i seperat, altså der er en side for hver table (tema)
Avatar billede supermand69 Nybegynder
28. september 2004 - 16:35 #18
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 ;
Avatar billede supermand69 Nybegynder
28. september 2004 - 16:37 #19
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);
?>
Avatar billede supermand69 Nybegynder
28. september 2004 - 16:44 #20
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
Avatar billede jakoba Nybegynder
28. september 2004 - 19:12 #21
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
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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