Jump to content
php.lv forumi

MySQL vaicājums


euphoric

Recommended Posts

Palīdziet lūdzu tik galā ar sintaksi ..

 

Ir divas tabulas table1 un table2

 

table1 (id,q,a1,a2)

table2 (id,pid,ip) ,kur `pid` == table1 `id` .

 

vaig izvilkt no table1 `id` kas nebuus vienaads ar table2 `pid` un shita usera ip, kas vienads ar table2 `ip` - izklausas diezgan traģiski, cerams kāds saprata domu.. Pie tam izvilktam rezultātam jābūt nejaušam, tad laikam japieliek "order by rand() limit 1" ?

 

Liekas, ka vaig taisīt ar LEFT JOIN ,nekad nēesmu viņu lietojis, paskatījos manualu un visadus piemērus, bet visi liekas kkadi man nepiemēroti.

 

Varbūt nēesmu uz pareizā ceļa ?

 

Paldies.

Edited by euphoric
Link to comment
Share on other sites

Tiku tik taalu :

 

SELECT table1.id FROM table1 INNER JOIN table2 ON (table1.id [b]=[/b] table2.pid) WHERE  table2.ip = '$user_ip'

 

tagad man izvada visus tos ierakstus kas ir arī table2 un kur mana ip sakrīt ar to..

 

Bet man vaig Otrādi.. , lai man izvada nevis tos kas sakrīt ar table2, bet visus tos kas nesakrīt.

 

ja rakstu tā :

(table1.id [b]!=[/b] table2.pid)

 

Tad notiek kārtējie brīnumi un izvada katru ierakstu pa 3, 4 reizem..

 

Kur būtu mana kļūda ?

 

Paldies :)

Edited by euphoric
Link to comment
Share on other sites

nu ja inner join jau pievieno tikai tos kas sakrīt

 

tev vajag left join. tas nozīmē, ka par pamatu ņem kreisās pusēs tabulu (to kas ierakstīta kreisajā pusē tam LEFT JOIN) un joino klāt no tās otras tabulas. ja pēc nosacījumā nekas neatrodas, tad ir vnk NULL. tāpēc manā piemērā bija WHERE table2.pid IS NULL

Link to comment
Share on other sites

kkas neštimē :(

 

Tātad pēc šāda pieprasījuma :

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id = table2.pid WHERE table2.pid IS NULL AND table2.ip = '$user_ip'

 

- vispār neko nerāda

 

 

Pēc šāda :

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id = table2.pid WHERE table2.pid = table1.id AND table2.ip = '$user_ip'

 

- izvelk visus kas sakrīt ar table2 (Principā tas apts kas sanāca ar INNER JOIN)

 

 

Tātad loģiski domājot vaig = mainīt uz !=

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id != table2.pid WHERE table2.pid = table1.id AND table2.ip = '$user_ip'

 

- neko neizvelk...

 

 

Šādi :

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id = table2.pid WHERE table2.pid = table1.id AND table2.ip != '$user_ip'

 

-izvelk tos kas neatbilst manai IP (loģiski)

 

Vārdu sakot izmēģināju visus iespējamos variantus, galvā putra 3h bezjēdzīgas bakstīšanās .. tas saucās gribēju kā labāk :D

 

Būtu taisījis ar entiem SELECT un pārbaudēm butu jau gultā , pofig ka Query'ijs par 0.3 sec ilgāks ... (chuckle)

 

Bet tomēr kas nepareizi ? (think)

Edited by euphoric
Link to comment
Share on other sites

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');

ljoin3_1267084446.png

Link to comment
Share on other sites

LEFT JOIN kā INNER JOIN tev strādā dēļ šī - LEFT JOIN table2 ON table1.id = table2.pid WHERE table2.pid = table1.id

 

Šis - table1 INNER JOIN table2 ON table1.id=table2.pid izvadīs to pašu, ko šis table1,table2 WHERE table1.id=table2.pid

 

vaig izvilkt no table1 `id` kas nebuus vienaads ar table2 `pid` un shita usera ip, kas vienads ar table2 `ip` - izklausas diezgan traģiski

Un šis neizklausās traģiski, bet gan neiespējami. Kā var izvilkt pēc piesaistītā ieraksta ip, ja tu gribi atrast to, kuram nemaz nav piesaistīta ieraksta, attiecīgi nav nekāda ip?

Link to comment
Share on other sites

Liels paldies par info, tagad viss skaidrs ar 'JOINiem'. :)

 

Bet tomēr IP man vaig checkot, jo nav jāvelk tikai tās rindas kas atbilst manam IP :

 

SELECT table1.id FROM table1 LEFT JOIN table2 ON (table1.id = table2.pid AND table2.ip = '$user_ip') WHERE table2.pid IS NULL order by rand() limit 1 

 

Un vēl table2.pid jābūt NULL , kas man iepriekš nebija uzlikts.

 

Vēlreiz paldies , domāju arī citiem šis izpalīdzēs ;)

Link to comment
Share on other sites

Un šis neizklausās traģiski, bet gan neiespējami. Kā var izvilkt pēc piesaistītā ieraksta ip, ja tu gribi atrast to, kuram nemaz nav piesaistīta ieraksta, attiecīgi nav nekāda ip?

aha, tā ir ka pārāk daudz grib. beigās sanāk 0 rows :D:D:D

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...