mysql_query("SELECT * FROM tabel WHERE user_id='din ting'")or die(mysql_error()); ???
ja, men jeg skal først lige hente alle tables der starter med "debate_"
eks.
debate_musik
debate_generelt
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
hvordan virker show tables da? :)
Det er kun tilladt at oprette et spørgsmål én gang, den regel accepterede du da du oprettede en bruger på eksperten.
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
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);
?>
arne, man kan også sætte en LIKE parameter på SHOW TABLES:
SHOW TABLES LIKE 'debate_%'
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];
}
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.
Jeg synes mere det lyder som web hotel med kun en database og helt forskellige applikationer ...
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?? :)
Hvis data naturligt passer ind i en tabel så er det formentlig hurtigst
at have dem i en tabel fremfor mange små tabeller.
hvad mener du?
hver table bliver jo søgt i seperat, altså der er en side for hver table (tema)
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 ;
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');
?>
</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);
?>
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
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