tādas lietas vajag debugot. kr4 vajag izmantot kkādu tooli, kas rāda katra selekta datus. tas toolis var būt phpmyadmin vai pašrakstīta funkcija (kā šajā gadījumā)
function dbconn($sSrv, $sDb, $sUsr, $sPw) { // inicializē mysql connection
@mysql_connect($sSrv, $sUsr, $sPw) or exit('<b>mysql_connect() error ' . mysql_errno() . ':</b> ' . mysql_error());
mysql_select_db($sDb) or exit('<b>mysql_select_db() error ' . mysql_errno() . ':</b> ' . mysql_error());
go('SET NAMES utf8');
}
function go($sSql) { // izpilda mysql query
$h = mysql_query($sSql) or exit('<b>mysql_query() error ' . mysql_errno() . ':</b> ' . mysql_error() . '<br /><b>query:</b> ' . substr($sSql, 0, 1000));
return $h;
}
function qs($s) {return is_null($s) ? 'NULL' : "'" . mysql_real_escape_string($s) . "'";} // query str - sagatavo tekstu (any string) ievietošanai mysql query
function rnull($r) { // make nulls visible: null -> 'NULL'
for ($i = 0; $i < count($r); $i++) if (is_null($r[$i])) $r[$i] = 'NULL';
return $r;
}
function esql($sSql, $sCm = '') { // echo sql & its returned data & optional comment (before sql)
$h = go($sSql);
if ($sCm) echo $sCm . '<br />';
echo $sSql . '<table cellpadding="1" cellspacing="0" border="1">';
while ($o = mysql_fetch_field($h)) $a[] = $o->name;
echo '<tr><th>' . implode('</th><th>', $a) . '</th></tr>';
while ($r = mysql_fetch_row($h)) echo '<tr><td>' . implode('</td><td>', rnull($r)) . '</td></tr>';
echo '</table><br />';
}
dbconn('localhost', 'test', 'root', '123');
go('DROP TABLE IF EXISTS t1, t2');
go('CREATE TABLE t1 (id int NOT NULL) ENGINE=MyISAM');
go('CREATE TABLE t2 (id int NOT NULL, pid int NOT NULL, ip varbinary(15) NOT NULL) ENGINE=MyISAM');
go('INSERT t1 (id) VALUES (1),(2),(3)');
go('INSERT t2 (id, pid, ip) VALUES (1,3,' . qs('123.123.123.123') . '),(2,3,' . qs('456.456.456.456') . '),(3,4,' . qs('123.123.123.123') . '),(4,4,' . qs('456.456.456.456') . ')');
esql('SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.pid', 'pie t1.id 1 un 2 ir piejoinojušās NULL, jo šādu t2.pid vērtību nav<br />no t2 ir piejoinojušās tikai pirmās 2 rindas, jo otrās 2 rindās ir tāds pid (4), kas nav nevienam t1.id');
esql('SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.id = t2.pid WHERE t2.id IS NULL', 'tātad lai paņemtu tās t1 rindas, kurām t1.id nav iekš t2.pid, vajag nočekot tikai t2.id IS NULL<br />kr4 ip vsp var nečekot ;)');
esql('SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.id = t2.pid WHERE t2.id IS NULL ORDER BY RAND() LIMIT 1', 'nejaušu rezultātu no performances viedokļa labāk būtu ņemt ar LIMIT $iRandOffset, 1<br />taču tad iepriekš ir jāzin šo rindu skaits, lai iegūtu $iRandOffset = rand(0, $iRowCount - 1);<br />tāpēc piemēra vienkāršības dēļ lai ir ~5x lēnākais ORDER BY RAND() LIMIT 1');