2011-07-18 17 views
1

私は音楽のために「ソーシャルシェアリング」のようなことをしています。問題に遭遇しました。私の友人のテーブルは次のように構成されています複雑なMySQLクエリ?

| id | username | songname | songid | plus | minus | 
---------------------------------------------------- 
|0001| username1| Songname | 000001 | 0001 | 00000 | 
|0002| username3| Song2222 | 000002 | 0000 | 00001 | 

をので、私は何をしようとしている、3人の友人どこのランダムなリストを取得することです:

| id |  f1 | f2 | status | 
---------------------------------------------- 
| 000001 | username1 |username2|  0  | 
| 000002 | username4 |username7|  1  | 

マイ料金表は次のように構成されていますステータスは1で、その後、プラスの値= 1のランダムな友人の最新レートごとにレート表を照会します。 'Recency'(あなたの場合)は、自動インクリメンタルであるIDに基づいています。

その部分は本当に難しいビットではありません。厳しいのは、ユーザがf1またはf2のいずれかにいる可能性があるため、クエリにORを含める必要があり、ユーザがf1にいる場合は対応するf2を取得する必要があり、逆も同様です。

次に、友だちでステータス= 1であることを確認してから、3人のランダムな友人による最新レートのクエリレートを確認します。そして、誰もがPHP/MySQLでこのようなスクリプト/クエリを記述する方法を知っているだろうならば、それらのデータビットをダウンロード

<a href="profile.php?u=username3">username 3</a> +1'd <a href="song.php?id=2">Song2222</a> 

の下の例のように3つの文字列を書き、私は本当に感謝されると思います!ハハ

ありがとう! :)

編集3 * 応答を待っている間に、私は部分的に動作するこのコードを作成しました!

<? session_start(); 
$user = $_SESSION['username']; 

mysql_connect("localhost", "xxxxx", "xxxx") or die(mysql_error()); 
mysql_select_db("xxxxxx") or die(mysql_error()); 

$q1data = mysql_query("SELECT * FROM friends WHERE (f1='$user') OR (f2='$user') AND status=1 ORDER BY RAND() LIMIT 1") ; 
    if(mysql_num_rows($q1data)===1) 
      { 
       $q1result = mysql_fetch_assoc($q1data); 
       $q1f1 = $q1result['f1']; 
       $q1f2 = $q1result['f2']; 
        if($q1f1==$user) { 
         $oq2un1 = $q1f2; 
         } 
        if($q1f2==$user) { 
        $oq2un1 = $q1f1; 
        } 
      } 
$q2data = mysql_query("SELECT * FROM friends WHERE (f1='$user') OR (f2='$user') AND status=1 ORDER BY RAND() LIMIT 1") ; 
    if(mysql_num_rows($q2data)===1) 
      { 
       $q2result = mysql_fetch_assoc($q2data); 
       $q2f1 = $q2result['f1']; 
       $q2f2 = $q2result['f2']; 
        if($q2f1==$user) { 
         $oq2un2 = $q2f2; 
         } 
        if($q2f2==$user) { 
        $oq2un2 = $q2f1; 
        } 
      } 
$q3data = mysql_query("SELECT * FROM friends WHERE (f1='$user') OR (f2='$user') AND status=1 ORDER BY RAND() LIMIT 1") ; 
    if(mysql_num_rows($q3data)===1) 
      { 
       $q3result = mysql_fetch_assoc($q3data); 
       $q3f1 = $q3result['f1']; 
       $q3f2 = $q3result['f2']; 
        if($q3f1==$user) { 
         $oq2un3 = $q3f2; 
         } 
        if($q3f2==$user) { 
        $oq2un3 = $q3f1; 
        } 
      } 

/************************************* SECOND SET OF QUERIES ******************************************/ 

$q4data = mysql_query("SELECT * FROM rates WHERE username='$oq2un1' AND plus=1 ORDER BY id LIMIT 1"); 
if(mysql_num_rows($q4data)===1) 
      { 
       $q4result = mysql_fetch_assoc($q4data); 
       $finalusername1 = $q4result['username']; 
       $q4songid = $q4result['song_id']; 
       $q4songname = $q4result['songname']; 
      } 
$q5data = mysql_query("SELECT * FROM rates WHERE username='$oq2un2' AND plus=1 ORDER BY id LIMIT 1"); 
if(mysql_num_rows($q5data)===1) 
      { 
       $q5result = mysql_fetch_assoc($q5data); 
       $finalusername2 = $q5result['username']; 
       $q5songid = $q5result['song_id']; 
       $q5songname = $q5result['songname']; 
      } 
$q6data = mysql_query("SELECT * FROM rates WHERE username='$oq2un3' AND plus=1 ORDER BY id LIMIT 1"); 
if(mysql_num_rows($q6data)===1) 
      { 
       $q3result = mysql_fetch_assoc($q6data); 
       $finalusername3= $q6result['username']; 
       $q6songid = $q6result['song_id']; 
       $q6songname = $q6result['songname']; 
      } 
$socialmuze_string1 = $finalusername1." recently <font color='#00FF00'>+1'd</font> <a href='song?id=".$q4songid."'>".$q4songname."</a><br>"; 
$socialmuze_string2 = $finalusername2." recently <font color='#00FF00'>+1'd</font> <a href='song?id=".$q5songid."'>".$q5songname."</a><br>"; 
$socialmuze_string3 = $finalusername3." recently <font color='#00FF00'>+1'd</font> <a href='song?id=".$q6songid."'>".$q6songname."</a><br>"; 

echo $finalusername1." ".$q4songname."<br>"; 
echo $finalusername2." ".$q5songname."<br>"; 
echo $finalusername3." ".$q6songname."<br>"; 

?>

+1

こんにちは@Karan、これまでに試したことと失敗した方法を投稿してください。私たちは物事をSOから修正し、より良いプログラマになることを支援します。 – rajah9

+0

よろしく! 私はそれほど多くを得ていません:S私は本当にこれの後に何をすべきか分かりません.S $ userはf1かf2です。編集*実際にはこれを質問 –

+0

に編集します最終的な解決策にもかかわらず、ユーザーセッション変数から埋め込まれた文字列を使用して文字列を作成すると、SQLインジェクション攻撃に広がる可能性があります。 – DRapp

答えて

0

のは、最初のSQL部分で作業してみましょう。あなたのコメントで

、あなたはまた、あなたはランダムなサンプルを取得したいと述べたあなたが

SELECT * FROM friends WHERE (f1='$user') OR (f2='$user') LIMIT 3 

を使用していると述べました。 MySQLは構造ORDER BY RAND()を持っているので、最初の3つはランダム化されます。

これを内側から見てみましょう。あなたは、このSELECT文を発行した場合

は:

SELECT * FROM friends where status=1 and (f1='$user' OR f2='$user') order by RAND() limit 3 

は、その後、私はあなたが友人のテーブルの状態= 1から3つのランダムな行になるだろうと思います。

(友人が正規化され、f1とf2が1列であり、f1とf2がどのように異なっていたかを示す列が追加されている場合はずっと簡単です。あなたは$のユーザーと呼ばれている6つのユーザ名を取得します1、彼らは同じ型でを想定し、(13)varchar型を言う。)

SELECT f1 FROM friends where status=1 and f1='$user' order by RAND() limit 3 
union all 
SELECT f2 FROM friends where status=1 and f2='$user' order by RAND() limit 3 

作業を進めていくうちに、最初のものを囲むためのクエリが必要になり、subselect文が作成されます。次のステップを実行するには、考えるかもしれません:あなたは友人のテーブルを正規化した場合

SELECT * from rates where username in (
    SELECT f1 FROM friends where status=1 and f1='$user' order by RAND() limit 3 
    union all 
    SELECT f2 FROM friends where status=1 and f2='$user' order by RAND() limit 3 
) 

はやはり、これはそれほど複雑ではないでしょう。

+0

私はusername1.username2のようないくつかの追加を考えていましたが、PHPの文字列ツールを使ってその意味を解読しましたが、友人それが論理的であるためには、何度もクエリが出てくる:Sとにかく、コードサンプルをありがとう!私はそれを試してみましょう! :) –

1

友人のクエリを変更して友だちだけを返すようにするのに役立つと思います。あなたのコードの例から部分を拾い、これは私がそれをやってお勧めする方法です:

session_start(); 
$user = $_SESSION['username']; 

// retrieve random 3 friends 
$rsFriends = mysql_query('SELECT `id`, 
     (CASE 
     WHEN `f1` = \'' . mysql_real_escape_string($user) . '\' THEN `f2` 
     WHEN `f2` = \'' . mysql_real_escape_string($user) . '\' THEN `f1` 
     END) AS `friend` 
    FROM `friends` 
    WHERE `status` = 1 
    AND (`f1` = \'' . mysql_real_escape_string($user) . '\' 
     OR `f2` = \'' . mysql_real_escape_string($user) . '\') 
    ORDER BY RAND() 
    LIMIT 3'); 
while ($row = mysql_fetch_assoc($rsFriends)) { 
    // retrieve the most recent rate entry where plus = 1 
    $rsRates = mysql_query('SELECT `id`, `username`, `songname`, `songid`, `plus`, `minus` 
     FROM `rates` 
     WHERE `username` = \'' . mysql_real_escape_string($row['friend']) . '\' 
     AND `plus` = 1 
     ORDER BY `id` DESC 
     LIMIT 1'); 
    while ($row1 = mysql_fetch_assoc($rsRates)) { 
     // $row1 is the array that contains the most recent rate where plus = 1 
    } 

}

友人のクエリを変更するとの利点は、それは常にであなたの友人の名前を与えることです単一の列。 UNIONを使用するような、友人クエリを書くための他の方法もありますが、これはシンプルでうまくいくはずです。

私は上記のコードをテストしていませんので、間違った表や列の名前を使用した場合は、修正してください。また、上記のコードサンプルは、あなたの例と一致していますが、JOINを使用して単一のクエリで上記を実行することもできます。

希望すると便利です。

+0

ありがとう!私はそれを試してみましょう:) –