euphoric Posted February 24, 2010 Report Share Posted February 24, 2010 (edited) 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 February 24, 2010 by euphoric Quote Link to comment Share on other sites More sharing options...
2easy Posted February 24, 2010 Report Share Posted February 24, 2010 SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id = table2.pid WHERE table2.pid IS NULL AND table2.ip = '123.123.123.123' Quote Link to comment Share on other sites More sharing options...
euphoric Posted February 24, 2010 Author Report Share Posted February 24, 2010 (edited) Hmm .. Pamēģināšu. Ne visai skaidrs tas NULL .. un ari tas, ka tagad būs tie ieraksti, kas vienādi ar table2. Tātad jaliek != Paldies :) Edited February 24, 2010 by euphoric Quote Link to comment Share on other sites More sharing options...
Kemito Posted February 24, 2010 Report Share Posted February 24, 2010 Varētu arī pateikt vai strādāja, lai priekš citiem varbūt arī noder :) Quote Link to comment Share on other sites More sharing options...
euphoric Posted February 24, 2010 Author Report Share Posted February 24, 2010 Šobrīd testēju , pagaidām neizdodas dabūt vajadzīgo rezultātu. Kad sanāks iepostēšu :) Quote Link to comment Share on other sites More sharing options...
euphoric Posted February 24, 2010 Author Report Share Posted February 24, 2010 (edited) 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 February 24, 2010 by euphoric Quote Link to comment Share on other sites More sharing options...
2easy Posted February 24, 2010 Report Share Posted February 24, 2010 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 Quote Link to comment Share on other sites More sharing options...
euphoric Posted February 25, 2010 Author Report Share Posted February 25, 2010 (edited) 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 February 25, 2010 by euphoric Quote Link to comment Share on other sites More sharing options...
2easy Posted February 25, 2010 Report Share Posted February 25, 2010 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'); Quote Link to comment Share on other sites More sharing options...
xPtv45z Posted February 25, 2010 Report Share Posted February 25, 2010 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? Quote Link to comment Share on other sites More sharing options...
euphoric Posted February 25, 2010 Author Report Share Posted February 25, 2010 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 ;) Quote Link to comment Share on other sites More sharing options...
2easy Posted February 25, 2010 Report Share Posted February 25, 2010 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 Quote Link to comment Share on other sites More sharing options...
2easy Posted February 25, 2010 Report Share Posted February 25, 2010 Vēlreiz paldies , domāju arī citiem šis izpalīdzēs ;) drīzāk būtu jāsaka "domāju arī citiem, kas nelasa f*ckin manuāli, šis izpalīdzēs" Quote Link to comment Share on other sites More sharing options...
euphoric Posted February 25, 2010 Author Report Share Posted February 25, 2010 kush, kush, kush Es lasu :D Bet citreiz vieglāk saprast kad izskaidro uz prikstiem , ne ? :P Quote Link to comment Share on other sites More sharing options...
2easy Posted February 25, 2010 Report Share Posted February 25, 2010 jā kad pabaro, tas ir forši :P Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.